--- a/src/lua_objs.c Thu Apr 02 03:02:54 2009 +0300
+++ b/src/lua_objs.c Thu Apr 02 03:19:44 2009 +0300
@@ -1,17 +1,11 @@
#include "lua_objs.h"
+#include "lua_irc.h"
#include "log.h"
#include <stdlib.h>
#include <string.h>
-#include <lua5.1/lua.h>
-#include <lua5.1/lualib.h>
-#include <lua5.1/lauxlib.h>
-
-/**
- * Convenience function to register a new metatable for a type, this leaves the metatable on the stack
- */
-static void lua_obj_create_type (lua_State *L, const char *name, const struct luaL_Reg methods[])
+void lua_obj_create_type (lua_State *L, const char *name, const struct luaL_Reg methods[])
{
luaL_newmetatable(L, name);
@@ -23,11 +17,7 @@
luaL_register(L, NULL, methods);
}
-/**
- * Convenience function to create a new userdata with the given type metatable name, return the pointer, and keep it
- * on the stack
- */
-static void* lua_obj_create_obj (lua_State *L, const char *name, size_t size)
+void* lua_obj_create_obj (lua_State *L, const char *name, size_t size)
{
// create the new userdata on the stack
void *ud = lua_newuserdata(L, size);
@@ -40,10 +30,7 @@
return ud;
}
-/**
- * Convenience function to create a new metatable for a type, a userdata for that type, and register it as a global
- */
-static void* lua_obj_create_global_type (lua_State *L, const char *type_name, const struct luaL_Reg methods[], const char *global_name, size_t size)
+void* lua_obj_create_global_type (lua_State *L, const char *type_name, const struct luaL_Reg methods[], const char *global_name, size_t size)
{
// allocate the global object
void *obj = lua_newuserdata(L, size);
@@ -61,10 +48,7 @@
return obj;
}
-/**
- * Convenience function to get a userdata with the given type metatable name as the first argument for a function
- */
-static void* lua_obj_get_obj (lua_State *L, const char *func, const char *name)
+void* lua_obj_get_obj (lua_State *L, const char *func, const char *name)
{
void *ud;
@@ -83,273 +67,6 @@
}
/**
- * Our lua wrapper for irc_chan
- */
-struct lua_chan {
- struct irc_chan *chan;
-};
-
-/**
- * Create a lua_chan userdata from the given irc_chan and leave it on the stack, returning 1
- */
-static int lua_chan_create (lua_State *L, struct irc_chan *chan)
-{
- // create the new obj
- struct lua_chan *lua_chan = lua_obj_create_obj(L, "evirc.chan", sizeof(*lua_chan));
-
- // initialize
- lua_chan->chan = chan;
-
- // ok
- return 1;
-}
-
-/**
- * Return the channel name as a lua string
- */
-static int lua_chan_tostring (lua_State *L)
-{
- struct lua_chan *lua_chan = lua_obj_get_obj(L, __func__, "evirc.chan");
-
- lua_pushfstring(L, "<irc_chan %s>", irc_chan_name(lua_chan->chan));
-
- return 1;
-}
-
-/**
- * Send a PRIVMSG to the channel
- */
-static int lua_chan_say (lua_State *L)
-{
- err_t err;
-
- struct lua_chan *lua_chan = lua_obj_get_obj(L, __func__, "evirc.chan");
-
- // the message
- const char *message = luaL_checkstring(L, 2);
-
- // send
- if ((err = irc_chan_PRIVMSG(lua_chan->chan, message)))
- return luaL_error(L, "irc_chan_PRIVMSG: '%s': %s", message, error_name(err));
-
- // ok
- return 0;
-}
-
-static const struct luaL_Reg lua_chan_methods[] = {
- { "__tostring", &lua_chan_tostring },
- { "say", &lua_chan_say },
- { NULL, NULL },
-};
-
-/**
- * Initialize the lua_chan object type
- */
-static void lua_chan_init (lua_State *L)
-{
- lua_obj_create_type(L, "evirc.chan", lua_chan_methods);
-}
-
-/**
- * Our lua wrapper for irc_net
- */
-struct lua_net {
- struct irc_net *net;
-};
-
-/**
- * Create a lua_net userdata from the given irc_net and push it onto the stack, returning 1.
- */
-static int lua_net_create (lua_State *L, struct irc_net *net)
-{
- // create the new obj
- struct lua_net *lua_net = lua_obj_create_obj(L, "evirc.net", sizeof(*lua_net));
-
- // initialize
- lua_net->net = net;
-
- // ok
- return 1;
-}
-
-/**
- * Return the network name as a lua string
- */
-static int lua_net_tostring (lua_State *L)
-{
- struct lua_net *lua_net = lua_obj_get_obj(L, __func__, "evirc.net");
-
- lua_pushfstring(L, "<irc_net %s>", irc_net_name(lua_net->net));
-
- return 1;
-}
-
-/**
- * Join a new channel, returning the lua_chan
- */
-static int lua_net_join (lua_State *L)
-{
- struct lua_net *lua_net = lua_obj_get_obj(L, __func__, "evirc.net");
- struct irc_chan_info chan_info;
- struct irc_chan *chan;
- struct error_info err;
-
- // the channel name
- chan_info.channel = luaL_checkstring(L, 2);
-
- // add it
- if (irc_net_add_chan(lua_net->net, &chan, &chan_info, &err))
- return luaL_error(L, "irc_net_add_chan: %s: %s", chan_info.channel, error_msg(&err));
-
- // return it
- return lua_chan_create(L, chan);
-}
-
-/**
- * Look up a channel by name, returning the lua_chan
- */
-static int lua_net_get_chan (lua_State *L)
-{
- struct lua_net *lua_net = lua_obj_get_obj(L, __func__, "evirc.net");
- struct irc_chan *chan;
-
- // the channel name
- const char *channel = luaL_checkstring(L, 2);
-
- // lookup the irc_chan
- if ((chan = irc_net_get_chan(lua_net->net, channel)) == NULL)
- return luaL_error(L, "irc_net_get_chan: no such channel: %s", channel);
-
- // wrap it
- return lua_chan_create(L, chan);
-}
-
-static const struct luaL_Reg lua_net_methods[] = {
- { "__tostring", &lua_net_tostring },
- { "join", &lua_net_join },
- { "channel", &lua_net_get_chan },
- { NULL, NULL }
-};
-
-/**
- * Initialize the lua_net object type
- */
-static void lua_net_init (lua_State *L)
-{
- lua_obj_create_type(L, "evirc.net", lua_net_methods);
-}
-
-/**
- * Wrapper for irc_client
- */
-struct lua_client {
- struct irc_client *client;
-
- struct irc_client_defaults defaults;
-};
-
-static int lua_client_set_defaults (lua_State *L)
-{
- struct lua_client *lua_client = lua_obj_get_obj(L, __func__, "evirc.client");
-
- // read the args
- // XXX: need to copy these, really
- lua_client->defaults.register_info.nickname = luaL_checkstring(L, 2);
- lua_client->defaults.register_info.username = luaL_checkstring(L, 3);
- lua_client->defaults.register_info.realname = luaL_checkstring(L, 4);
-
- // set the non-args
- lua_client->defaults.service = IRC_PORT;
- lua_client->defaults.service_ssl = IRC_SSL_PORT;
-
- // invoke
- irc_client_set_defaults(lua_client->client, &lua_client->defaults);
-
- // ok
- return 0;
-}
-
-static int lua_client_connect (lua_State *L)
-{
- struct lua_client *lua_client = lua_obj_get_obj(L, __func__, "evirc.client");
- struct irc_net_info net_info;
- struct irc_net *net;
- struct error_info err;
-
- // init net_info
- memset(&net_info, 0, sizeof(net_info));
-
- // the network name
- net_info.network = luaL_checkstring(L, 2);
-
- // the hostname
- net_info.hostname = luaL_checkstring(L, 3);
-
- // service remains default
- net_info.service = "6667";
-
- // create it
- if (irc_client_add_net(lua_client->client, &net, &net_info, &err))
- return luaL_error(L, "irc_client_add_net: %s/%s: %s", net_info.network, net_info.hostname, error_msg(&err));
-
- // wrap it
- return lua_net_create(L, net);
-}
-
-static int lua_client_get_network (lua_State *L)
-{
- struct lua_client *lua_client = lua_obj_get_obj(L, __func__, "evirc.client");
- struct irc_net *net;
-
- // the network name
- const char *network = luaL_checkstring(L, 2);
-
- // lookup the irc_net
- if ((net = irc_client_get_net(lua_client->client, network)) == NULL)
- return luaL_error(L, "irc_client_get_net: no such network: %s", network);
-
- // wrap it
- return lua_net_create(L, net);
-}
-
-static int lua_client_quit (lua_State *L)
-{
- struct lua_client *lua_client = lua_obj_get_obj(L, __func__, "evirc.client");
- err_t err;
-
- // the message
- const char *message = luaL_checkstring(L, 2);
-
- // execute
- if ((err = irc_client_quit(lua_client->client, message)))
- return luaL_error(L, "irc_client_quit: %s", error_name(err));
-
- // ok
- return 0;
-}
-
-static const struct luaL_Reg lua_client_methods[] = {
- { "set_defaults", &lua_client_set_defaults },
- { "connect", &lua_client_connect },
- { "network", &lua_client_get_network },
- { "quit", &lua_client_quit },
- { NULL, NULL }
-};
-
-/**
- * Initialize the evirc.client type for lua_client, and registers an instance bound to the given irc_client at
- * 'client'.
- */
-static void lua_client_init (lua_State *L, struct irc_client *client)
-{
- // allocate the global "client" object
- struct lua_client *lua_client = lua_obj_create_global_type(L, "evirc.client", lua_client_methods, "client", sizeof(*lua_client));
-
- // initialize it
- lua_client->client = client;
-}
-
-/**
* Wrapper for module
*/
struct lua_module {
@@ -711,33 +428,12 @@
}
}
-/**
- * Set up the lua state in protected mode
- */
-static int _lua_objs_init (lua_State *L)
+void lua_objs_init (struct nexus_lua *lua)
{
- struct nexus *nexus;
-
- // read the nexus off the stack
- if ((nexus = lua_touserdata(L, 1)) == NULL)
- luaL_error(L, "lua_touserdata: NULL");
-
// init the various bits
- lua_global_init(L);
- lua_nexus_init(L, nexus);
- lua_modules_init(L, nexus->modules);
- lua_module_init(L);
- lua_client_init(L, nexus->client);
- lua_net_init(L);
- lua_chan_init(L);
-
- // nothing
- return 0;
+ lua_global_init(lua->st);
+ lua_nexus_init(lua->st, lua->nexus);
+ lua_modules_init(lua->st, lua->nexus->modules);
+ lua_module_init(lua->st);
}
-err_t lua_objs_init (struct nexus_lua *lua, struct error_info *err)
-{
- // call in protected mode
- return nexus_lua_error(lua->st, lua_cpcall(lua->st, &_lua_objs_init, lua->nexus), err);
-}
-