20 llm_##WHAT##_t *object = luaL_checkudata (L, index, "loudmouth." #WHAT); \ |
20 llm_##WHAT##_t *object = luaL_checkudata (L, index, "loudmouth." #WHAT); \ |
21 luaL_argcheck (L, object != NULL, index, "loudmouth " #WHAT " expected"); \ |
21 luaL_argcheck (L, object != NULL, index, "loudmouth " #WHAT " expected"); \ |
22 return object; \ |
22 return object; \ |
23 } |
23 } |
24 |
24 |
25 #define LLM_BLESS(WHAT, TYPE) \ |
25 #define LLM_BLESS(WHAT, LWHAT, TYPE) \ |
26 llm_##WHAT##_t *llm_##WHAT##_bless (lua_State *L, TYPE *WHAT) \ |
26 llm_##WHAT##_t *bless_lm_##WHAT (lua_State *L, TYPE *WHAT) \ |
27 { \ |
27 { \ |
28 llm_##WHAT##_t *object; /* top of stack */ \ |
28 llm_##WHAT##_t *object; /* top of stack */ \ |
29 lua_pushstring (L, LLM_OBJREGISTRY); /* 1 registry table name */ \ |
29 lua_pushstring (L, LLM_OBJREGISTRY); /* 1 registry table name */ \ |
30 lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \ |
30 lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \ |
31 lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \ |
31 lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \ |
32 lua_rawget (L, -2); /* 2 object/nil */ \ |
32 lua_rawget (L, -2); /* 2 object/nil */ \ |
33 if (!lua_isnil (L, -1)) { /* 2 object */ \ |
33 if (!lua_isnil (L, -1)) { /* 2 object */ \ |
34 lua_remove (L, -2); /* 1 object */ \ |
34 lua_remove (L, -2); /* 1 object */ \ |
35 object = lua_touserdata (L, -1); \ |
35 object = lua_touserdata (L, -1); \ |
36 D ("Existing " #WHAT " object %X requested", (int) object); \ |
36 D ("Existing " #LWHAT " object %X requested", (int) object); \ |
37 return object; \ |
37 return object; \ |
38 } \ |
38 } \ |
39 /* 2 nil */ \ |
39 /* 2 nil */ \ |
40 lua_remove (L, -1); /* 1 registry table */ \ |
40 lua_remove (L, -1); /* 1 registry table */ \ |
41 object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \ |
41 object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \ |
42 luaL_getmetatable (L, "loudmouth." #WHAT); /* 3 metatable */ \ |
42 luaL_getmetatable (L, "loudmouth." #LWHAT); /* 3 metatable */ \ |
43 lua_setmetatable (L, -2); /* 2 object */ \ |
43 lua_setmetatable (L, -2); /* 2 object */ \ |
44 lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \ |
44 lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \ |
45 lua_pushvalue (L, -2); /* 4 object */ \ |
45 lua_pushvalue (L, -2); /* 4 object */ \ |
46 lua_rawset (L, -4); /* 2 object */ \ |
46 lua_rawset (L, -4); /* 2 object */ \ |
47 lua_remove (L, -2); /* 1 object */ \ |
47 lua_remove (L, -2); /* 1 object */ \ |
48 object->WHAT = WHAT; \ |
48 object->WHAT = WHAT; \ |
49 lm_##WHAT##_ref (WHAT); \ |
49 lm_##LWHAT##_ref (WHAT); \ |
50 D ("New " #WHAT " object %X blessed", (int) object); \ |
50 D ("New " #LWHAT " object %X blessed", (int) object); \ |
51 return object; \ |
51 return object; \ |
52 } |
52 } |
53 |
53 |
54 #define LLM_DEFINE(WHAT, TYPE) \ |
54 #define LLM_DEFINE(WHAT, LWHAT, TYPE) \ |
55 LLM_CHECK (WHAT, TYPE) \ |
55 LLM_CHECK (WHAT, TYPE) \ |
56 LLM_BLESS (WHAT, TYPE) |
56 LLM_BLESS (WHAT, LWHAT, TYPE) |
57 |
57 |
58 LLM_DEFINE (connection, LmConnection) |
58 LLM_DEFINE (connection, connection, LmConnection) |
59 LLM_DEFINE (message, LmMessage) |
59 LLM_DEFINE (message, message, LmMessage) |
60 LLM_DEFINE (message_handler, LmMessageHandler) |
60 LLM_DEFINE (handler, message_handler, LmMessageHandler) |
61 LLM_DEFINE (message_node, LmMessageNode) |
61 LLM_DEFINE (node, message_node, LmMessageNode) |
62 LLM_DEFINE (proxy, LmProxy) |
62 LLM_DEFINE (proxy, proxy, LmProxy) |
63 LLM_DEFINE (ssl, LmSSL) |
63 LLM_DEFINE (ssl, ssl, LmSSL) |
64 |
64 |
65 LmMessageNode *luaL_checkLmMessageNode (lua_State *L, int index) |
65 LmMessageNode *luaL_checkLmMessageNode (lua_State *L, int index) |
66 { |
66 { |
67 void *object; |
67 void *object; |
68 luaL_argcheck (L, lua_type (L, index) == LUA_TUSERDATA, index, "loudmouth message or message node expected"); |
68 luaL_argcheck (L, lua_type (L, index) == LUA_TUSERDATA, index, "loudmouth message or message node expected"); |
71 luaL_getmetatable (L, "loudmouth.message"); |
71 luaL_getmetatable (L, "loudmouth.message"); |
72 luaL_getmetatable (L, "loudmouth.message_node"); |
72 luaL_getmetatable (L, "loudmouth.message_node"); |
73 if (lua_rawequal (L, -2, -3)) // Message |
73 if (lua_rawequal (L, -2, -3)) // Message |
74 object = (void *) lm_message_get_node (((llm_message_t *) object)->message); |
74 object = (void *) lm_message_get_node (((llm_message_t *) object)->message); |
75 else if (lua_rawequal (L, -1, -3)) // Node |
75 else if (lua_rawequal (L, -1, -3)) // Node |
76 object = (void *) (((llm_message_node_t *) object)->message_node); |
76 object = (void *) (((llm_node_t *) object)->node); |
77 else |
77 else |
78 luaL_argerror (L, index, "loudmouth message or message node expected"); |
78 luaL_argerror (L, index, "loudmouth message or message node expected"); |
79 lua_pop (L, 3); |
79 lua_pop (L, 3); |
80 return (LmMessageNode *) object; |
80 return (LmMessageNode *) object; |
81 } |
81 } |