lm_types.c
changeset 11 a8c6460d612b
parent 7 5db1448eb857
child 12 63f06a23c235
equal deleted inserted replaced
10:aed141accdd9 11:a8c6460d612b
    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 }