author | Myhailo Danylenko <isbear@ukrpost.net> |
Wed, 20 May 2009 19:48:34 +0300 | |
changeset 26 | 1f7e8b53b255 |
parent 23 | 13f03e604c8a |
child 27 | 23393a00c2c1 |
permissions | -rw-r--r-- |
23 | 1 |
|
2 |
/* Copyright 2009 Myhailo Danylenko |
|
3 |
||
4 |
This file is part of lua-lm. |
|
5 |
||
6 |
lua-lm is free software: you can redistribute it and/or modify |
|
7 |
it under the terms of the GNU General Public License as published by |
|
8 |
the Free Software Foundation, either version 2 of the License, or |
|
9 |
(at your option) any later version. |
|
10 |
||
11 |
This program is distributed in the hope that it will be useful, |
|
12 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
13 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
14 |
GNU General Public License for more details. |
|
15 |
||
16 |
You should have received a copy of the GNU General Public License |
|
17 |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
|
0 | 18 |
|
19 |
#include <lua.h> |
|
20 |
#include <lauxlib.h> |
|
21 |
#include <loudmouth/loudmouth.h> // lm_*ref |
|
22 |
||
6
90073cbb535d
Logging and chained methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
0
diff
changeset
|
23 |
#include "config.h" |
0 | 24 |
#include "lm_types.h" |
25 |
#include "util.h" |
|
26 |
||
27 |
void llm_callback_destroy (llm_callback_t *cb) |
|
28 |
{ |
|
6
90073cbb535d
Logging and chained methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
0
diff
changeset
|
29 |
D ("Destroying callback %X", (int) cb); |
0 | 30 |
luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference); |
31 |
luaL_free (cb->L, cb); |
|
32 |
} |
|
33 |
||
12 | 34 |
#define LLM_CHECK(WHAT, LWHAT, TYPE) \ |
0 | 35 |
llm_##WHAT##_t *luaL_checklm_##WHAT (lua_State *L, int index) \ |
36 |
{ \ |
|
12 | 37 |
llm_##WHAT##_t *object = luaL_checkudata (L, index, "loudmouth." #LWHAT); \ |
0 | 38 |
luaL_argcheck (L, object != NULL, index, "loudmouth " #WHAT " expected"); \ |
39 |
return object; \ |
|
40 |
} |
|
41 |
||
12 | 42 |
#define LLM_BLESS(WHAT, LWHAT, TYPE) \ |
11
a8c6460d612b
Naming scheme change to more ld-friendly
Myhailo Danylenko <isbear@ukrpost.net>
parents:
7
diff
changeset
|
43 |
llm_##WHAT##_t *bless_lm_##WHAT (lua_State *L, TYPE *WHAT) \ |
0 | 44 |
{ \ |
45 |
llm_##WHAT##_t *object; /* top of stack */ \ |
|
19
d775d7289fe4
Use lua_pushliteral and lua_setfield
Myhailo Danylenko <isbear@ukrpost.net>
parents:
12
diff
changeset
|
46 |
lua_pushliteral (L, LLM_OBJREGISTRY); /* 1 registry table name */ \ |
0 | 47 |
lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \ |
48 |
lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \ |
|
49 |
lua_rawget (L, -2); /* 2 object/nil */ \ |
|
50 |
if (!lua_isnil (L, -1)) { /* 2 object */ \ |
|
51 |
lua_remove (L, -2); /* 1 object */ \ |
|
52 |
object = lua_touserdata (L, -1); \ |
|
12 | 53 |
D ("Existing " #LWHAT " object %X requested", (int) object); \ |
0 | 54 |
return object; \ |
55 |
} \ |
|
56 |
/* 2 nil */ \ |
|
57 |
lua_remove (L, -1); /* 1 registry table */ \ |
|
58 |
object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \ |
|
12 | 59 |
luaL_getmetatable (L, "loudmouth." #LWHAT); /* 3 metatable */ \ |
0 | 60 |
lua_setmetatable (L, -2); /* 2 object */ \ |
61 |
lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \ |
|
62 |
lua_pushvalue (L, -2); /* 4 object */ \ |
|
63 |
lua_rawset (L, -4); /* 2 object */ \ |
|
64 |
lua_remove (L, -2); /* 1 object */ \ |
|
65 |
object->WHAT = WHAT; \ |
|
12 | 66 |
lm_##LWHAT##_ref (WHAT); \ |
67 |
D ("New " #LWHAT " object %X blessed", (int) object); \ |
|
0 | 68 |
return object; \ |
69 |
} |
|
70 |
||
11
a8c6460d612b
Naming scheme change to more ld-friendly
Myhailo Danylenko <isbear@ukrpost.net>
parents:
7
diff
changeset
|
71 |
#define LLM_DEFINE(WHAT, LWHAT, TYPE) \ |
12 | 72 |
LLM_CHECK (WHAT, LWHAT, TYPE) \ |
11
a8c6460d612b
Naming scheme change to more ld-friendly
Myhailo Danylenko <isbear@ukrpost.net>
parents:
7
diff
changeset
|
73 |
LLM_BLESS (WHAT, LWHAT, TYPE) |
0 | 74 |
|
11
a8c6460d612b
Naming scheme change to more ld-friendly
Myhailo Danylenko <isbear@ukrpost.net>
parents:
7
diff
changeset
|
75 |
LLM_DEFINE (connection, connection, LmConnection) |
a8c6460d612b
Naming scheme change to more ld-friendly
Myhailo Danylenko <isbear@ukrpost.net>
parents:
7
diff
changeset
|
76 |
LLM_DEFINE (message, message, LmMessage) |
a8c6460d612b
Naming scheme change to more ld-friendly
Myhailo Danylenko <isbear@ukrpost.net>
parents:
7
diff
changeset
|
77 |
LLM_DEFINE (handler, message_handler, LmMessageHandler) |
a8c6460d612b
Naming scheme change to more ld-friendly
Myhailo Danylenko <isbear@ukrpost.net>
parents:
7
diff
changeset
|
78 |
LLM_DEFINE (node, message_node, LmMessageNode) |
a8c6460d612b
Naming scheme change to more ld-friendly
Myhailo Danylenko <isbear@ukrpost.net>
parents:
7
diff
changeset
|
79 |
LLM_DEFINE (proxy, proxy, LmProxy) |
a8c6460d612b
Naming scheme change to more ld-friendly
Myhailo Danylenko <isbear@ukrpost.net>
parents:
7
diff
changeset
|
80 |
LLM_DEFINE (ssl, ssl, LmSSL) |
0 | 81 |
|
7
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
82 |
LmMessageNode *luaL_checkLmMessageNode (lua_State *L, int index) |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
83 |
{ |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
84 |
void *object; |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
85 |
luaL_argcheck (L, lua_type (L, index) == LUA_TUSERDATA, index, "loudmouth message or message node expected"); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
86 |
object = lua_touserdata (L, index); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
87 |
lua_getmetatable (L, index); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
88 |
luaL_getmetatable (L, "loudmouth.message"); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
89 |
luaL_getmetatable (L, "loudmouth.message_node"); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
90 |
if (lua_rawequal (L, -2, -3)) // Message |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
91 |
object = (void *) lm_message_get_node (((llm_message_t *) object)->message); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
92 |
else if (lua_rawequal (L, -1, -3)) // Node |
11
a8c6460d612b
Naming scheme change to more ld-friendly
Myhailo Danylenko <isbear@ukrpost.net>
parents:
7
diff
changeset
|
93 |
object = (void *) (((llm_node_t *) object)->node); |
7
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
94 |
else |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
95 |
luaL_argerror (L, index, "loudmouth message or message node expected"); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
96 |
lua_pop (L, 3); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
97 |
return (LmMessageNode *) object; |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
98 |
} |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
99 |
|
0 | 100 |
#undef LLM_DEFINE |
101 |