--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lm_types.c Sun Feb 01 21:28:57 2009 +0200
@@ -0,0 +1,62 @@
+
+#include <lua.h>
+#include <lauxlib.h>
+#include <loudmouth/loudmouth.h> // lm_*ref
+
+#include "lm_types.h"
+#include "util.h"
+
+void llm_callback_destroy (llm_callback_t *cb)
+{
+ luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
+ luaL_free (cb->L, cb);
+}
+
+#define LLM_CHECK(WHAT, TYPE) \
+llm_##WHAT##_t *luaL_checklm_##WHAT (lua_State *L, int index) \
+{ \
+ llm_##WHAT##_t *object = luaL_checkudata (L, index, "loudmouth." #WHAT); \
+ luaL_argcheck (L, object != NULL, index, "loudmouth " #WHAT " expected"); \
+ return object; \
+}
+
+#define LLM_BLESS(WHAT, TYPE) \
+llm_##WHAT##_t *llm_##WHAT##_bless (lua_State *L, TYPE *WHAT) \
+{ \
+ llm_##WHAT##_t *object; /* top of stack */ \
+ lua_pushstring (L, LLM_OBJREGISTRY); /* 1 registry table name */ \
+ lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \
+ lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \
+ lua_rawget (L, -2); /* 2 object/nil */ \
+ if (!lua_isnil (L, -1)) { /* 2 object */ \
+ lua_remove (L, -2); /* 1 object */ \
+ object = lua_touserdata (L, -1); \
+ return object; \
+ } \
+ /* 2 nil */ \
+ lua_remove (L, -1); /* 1 registry table */ \
+ object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \
+ luaL_getmetatable (L, "loudmouth." #WHAT); /* 3 metatable */ \
+ lua_setmetatable (L, -2); /* 2 object */ \
+ lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \
+ lua_pushvalue (L, -2); /* 4 object */ \
+ lua_rawset (L, -4); /* 2 object */ \
+ lua_remove (L, -2); /* 1 object */ \
+ object->WHAT = WHAT; \
+ lm_##WHAT##_ref (WHAT); \
+ return object; \
+}
+
+#define LLM_DEFINE(WHAT, TYPE) \
+LLM_CHECK (WHAT, TYPE) \
+LLM_BLESS (WHAT, TYPE)
+
+LLM_DEFINE (connection, LmConnection)
+LLM_DEFINE (message, LmMessage)
+LLM_DEFINE (message_handler, LmMessageHandler)
+LLM_DEFINE (message_node, LmMessageNode)
+LLM_DEFINE (proxy, LmProxy)
+LLM_DEFINE (ssl, LmSSL)
+
+#undef LLM_DEFINE
+