12 |
12 |
13 /// lm.message_node.bless |
13 /// lm.message_node.bless |
14 /// Blesses given pointer to lm message node object. |
14 /// Blesses given pointer to lm message node object. |
15 /// A: lightuserdata (C lm message node object) |
15 /// A: lightuserdata (C lm message node object) |
16 /// R: lm message node object |
16 /// R: lm message node object |
17 static int llm_message_node_bless_lua (lua_State *L) |
17 static int bless_lua_lm_node (lua_State *L) |
18 { |
18 { |
19 luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "loudmouth message node lightuserdata expected"); |
19 luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "loudmouth message node lightuserdata expected"); |
20 llm_message_node_bless (L, lua_touserdata (L, 1)); |
20 bless_lm_node (L, lua_touserdata (L, 1)); |
21 return 1; |
21 return 1; |
22 } |
22 } |
23 |
23 |
24 /// message_node:name |
24 /// message_node:name |
25 /// Gets a name of message node. |
25 /// Gets a name of message node. |
26 /// R: string |
26 /// R: string |
27 int llm_message_node_name (lua_State *L) |
27 int name_lm_node (lua_State *L) |
28 { |
28 { |
29 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
29 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
30 lua_pushstring (L, node->name); |
30 lua_pushstring (L, node->name); |
31 return 1; |
31 return 1; |
32 } |
32 } |
33 |
33 |
34 /// message_node:next |
34 /// message_node:next |
35 /// Gets next message node. |
35 /// Gets next message node. |
36 /// R: lm message node object or nil |
36 /// R: lm message node object or nil |
37 int llm_message_node_next (lua_State *L) |
37 int next_lm_node (lua_State *L) |
38 { |
38 { |
39 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
39 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
40 LmMessageNode *next = node->next; |
40 LmMessageNode *next = node->next; |
41 if (next) |
41 if (next) |
42 llm_message_node_bless (L, next); |
42 bless_lm_node (L, next); |
43 else |
43 else |
44 lua_pushnil (L); |
44 lua_pushnil (L); |
45 return 1; |
45 return 1; |
46 } |
46 } |
47 |
47 |
48 /// message_node:prev |
48 /// message_node:prev |
49 /// Gets previous message node. |
49 /// Gets previous message node. |
50 /// R: lm message node object or nil |
50 /// R: lm message node object or nil |
51 int llm_message_node_prev (lua_State *L) |
51 int prev_lm_node (lua_State *L) |
52 { |
52 { |
53 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
53 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
54 LmMessageNode *prev = node->prev; |
54 LmMessageNode *prev = node->prev; |
55 if (prev) |
55 if (prev) |
56 llm_message_node_bless (L, prev); |
56 bless_lm_node (L, prev); |
57 else |
57 else |
58 lua_pushnil (L); |
58 lua_pushnil (L); |
59 return 1; |
59 return 1; |
60 } |
60 } |
61 |
61 |
62 /// message_node:children |
62 /// message_node:children |
63 /// Gets first child node (raw access used). |
63 /// Gets first child node (raw access used). |
64 /// R: lm message node object or nil |
64 /// R: lm message node object or nil |
65 int llm_message_node_children (lua_State *L) |
65 int children_lm_node (lua_State *L) |
66 { |
66 { |
67 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
67 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
68 LmMessageNode *child = node->children; |
68 LmMessageNode *child = node->children; |
69 if (child) |
69 if (child) |
70 llm_message_node_bless (L, child); |
70 bless_lm_node (L, child); |
71 else |
71 else |
72 lua_pushnil (L); |
72 lua_pushnil (L); |
73 return 1; |
73 return 1; |
74 } |
74 } |
75 |
75 |
76 /// message_node:parent |
76 /// message_node:parent |
77 /// Gets parent message node. |
77 /// Gets parent message node. |
78 /// R: lm message node object or nil |
78 /// R: lm message node object or nil |
79 int llm_message_node_parent (lua_State *L) |
79 int parent_lm_node (lua_State *L) |
80 { |
80 { |
81 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
81 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
82 LmMessageNode *parent = node->parent; |
82 LmMessageNode *parent = node->parent; |
83 if (parent) |
83 if (parent) |
84 llm_message_node_bless (L, parent); |
84 bless_lm_node (L, parent); |
85 else |
85 else |
86 lua_pushnil (L); |
86 lua_pushnil (L); |
87 return 1; |
87 return 1; |
88 } |
88 } |
89 |
89 |
90 /// message_node:value |
90 /// message_node:value |
91 /// Gets or sets a value of message node. |
91 /// Gets or sets a value of message node. |
92 /// A: string (optional value) |
92 /// A: string (optional value) |
93 /// R: string (if called without arguments) or lm message node object |
93 /// R: string (if called without arguments) or lm message node object |
94 int llm_message_node_value (lua_State *L) |
94 int value_lm_node (lua_State *L) |
95 { |
95 { |
96 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
96 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
97 if (lua_gettop (L) > 1) { // Set |
97 if (lua_gettop (L) > 1) { // Set |
98 const char *value = luaL_checkstring (L, 2); |
98 const char *value = luaL_checkstring (L, 2); |
99 lm_message_node_set_value (node, value); |
99 lm_message_node_set_value (node, value); |
121 if (!child) { |
121 if (!child) { |
122 lua_pushnil (L); |
122 lua_pushnil (L); |
123 return 1; |
123 return 1; |
124 } |
124 } |
125 } |
125 } |
126 llm_message_node_bless (L, child); |
126 bless_lm_node (L, child); |
127 // XXX lm_message_node_unref (child); |
127 // XXX lm_message_node_unref (child); |
128 return 1; |
128 return 1; |
129 } |
129 } |
130 |
130 |
131 /// message_node:find_child |
131 /// message_node:find_child |
132 /// Searches for node with a given name over all node subtree. |
132 /// Searches for node with a given name over all node subtree. |
133 /// A: string (name) |
133 /// A: string (name) |
134 /// R: lm message node object or nil |
134 /// R: lm message node object or nil |
135 int llm_message_node_find_child (lua_State *L) |
135 int find_child_lm_node (lua_State *L) |
136 { |
136 { |
137 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
137 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
138 const char *name = luaL_checkstring (L, 2); |
138 const char *name = luaL_checkstring (L, 2); |
139 LmMessageNode *child; |
139 LmMessageNode *child; |
140 |
140 |
141 child = lm_message_node_get_child (node, name); |
141 child = lm_message_node_get_child (node, name); |
142 if (!child) |
142 if (!child) |
143 lua_pushnil (L); |
143 lua_pushnil (L); |
144 else { |
144 else { |
145 llm_message_node_bless (L, child); |
145 bless_lm_node (L, child); |
146 // XXX lm_message_node_unref (child); |
146 // XXX lm_message_node_unref (child); |
147 } |
147 } |
148 return 1; |
148 return 1; |
149 } |
149 } |
150 |
150 |
151 /// message_node:raw |
151 /// message_node:raw |
152 /// Gets or sets raw mode flag for node. |
152 /// Gets or sets raw mode flag for node. |
153 /// When set, value of node will not be escaped. |
153 /// When set, value of node will not be escaped. |
154 /// A: boolean (optional) |
154 /// A: boolean (optional) |
155 /// V: boolean (if called with no apguments) or lm message node object |
155 /// V: boolean (if called with no apguments) or lm message node object |
156 int llm_message_node_raw (lua_State *L) |
156 int raw_lm_node (lua_State *L) |
157 { |
157 { |
158 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
158 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
159 if (lua_gettop (L) > 1) { // Set |
159 if (lua_gettop (L) > 1) { // Set |
160 luaL_checktype (L, 2, LUA_TBOOLEAN); |
160 luaL_checktype (L, 2, LUA_TBOOLEAN); |
161 lm_message_node_set_raw_mode (node, lua_toboolean (L, 2)); |
161 lm_message_node_set_raw_mode (node, lua_toboolean (L, 2)); |
194 /// message_node:path |
194 /// message_node:path |
195 /// Returns node with specified path to it. |
195 /// Returns node with specified path to it. |
196 /// If any element in a path cannot be found, it returns nil. |
196 /// If any element in a path cannot be found, it returns nil. |
197 /// A: string (node name), ... |
197 /// A: string (node name), ... |
198 /// R: lm message node object or nil |
198 /// R: lm message node object or nil |
199 int llm_message_node_path (lua_State *L) |
199 int path_lm_node (lua_State *L) |
200 { |
200 { |
201 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
201 LmMessageNode *node = luaL_checkLmMessageNode (L, 1); |
202 int i = 1; |
202 int i = 1; |
203 while (i++ < lua_gettop (L)) { |
203 while (i++ < lua_gettop (L)) { |
204 node = lm_message_node_get_child (node, luaL_checkstring (L, i)); |
204 node = lm_message_node_get_child (node, luaL_checkstring (L, i)); |
205 if (node == NULL) { |
205 if (node == NULL) { |
206 lua_pushnil (L); |
206 lua_pushnil (L); |
207 return 1; |
207 return 1; |
208 } |
208 } |
209 } |
209 } |
210 llm_message_node_bless (L, node); |
210 bless_lm_node (L, node); |
211 // XXX lm_message_node_unref (child); |
211 // XXX lm_message_node_unref (child); |
212 return 1; |
212 return 1; |
213 } |
213 } |
214 |
214 |
215 /// message_node:pointer |
215 /// message_node:pointer |
216 /// Returns pointer to underlying C structure. |
216 /// Returns pointer to underlying C structure. |
217 /// R: lightuserdata |
217 /// R: lightuserdata |
218 static int llm_message_node_pointer (lua_State *L) |
218 static int pointer_lm_node (lua_State *L) |
219 { |
219 { |
220 llm_message_node_t *object = luaL_checklm_message_node (L, 1); |
220 llm_node_t *object = luaL_checklm_node (L, 1); |
221 lua_pushlightuserdata (L, object->message_node); |
221 lua_pushlightuserdata (L, object->node); |
222 return 1; |
222 return 1; |
223 } |
223 } |
224 |
224 |
225 static int llm_message_node_gc (lua_State *L) |
225 static int gc_lm_node (lua_State *L) |
226 { |
226 { |
227 llm_message_node_t *object = luaL_checklm_message_node (L, 1); |
227 llm_node_t *object = luaL_checklm_node (L, 1); |
228 D ("Message node %X gc called", (int) object); |
228 D ("Message node %X gc called", (int) object); |
229 lm_message_node_unref (object->message_node); |
229 lm_message_node_unref (object->node); |
230 return 0; |
230 return 0; |
231 } |
231 } |
232 |
232 |
233 static const luaL_Reg llm_message_node_reg_f[] = { |
233 static const luaL_Reg reg_f_lm_node[] = { |
234 { "bless", llm_message_node_bless_lua }, |
234 { "bless", bless_lua_lm_node }, |
235 { NULL, NULL }, |
235 { NULL, NULL }, |
236 }; |
236 }; |
237 |
237 |
238 static const luaL_Reg llm_message_node_reg_m[] = { |
238 static const luaL_Reg reg_m_lm_node[] = { |
239 { "name", llm_message_node_name }, |
239 { "name", name_lm_node }, |
240 { "next", llm_message_node_next }, |
240 { "next", next_lm_node }, |
241 { "prev", llm_message_node_prev }, |
241 { "prev", prev_lm_node }, |
242 { "children", llm_message_node_children }, |
242 { "children", children_lm_node }, |
243 { "parent", llm_message_node_parent }, |
243 { "parent", parent_lm_node }, |
244 { "value", llm_message_node_value }, |
244 { "value", value_lm_node }, |
245 { "child", llm_message_node_child }, |
245 { "child", child_lm_node }, |
246 { "find_child", llm_message_node_find_child }, |
246 { "find_child", find_child_lm_node }, |
247 { "attribute", llm_message_node_attribute }, |
247 { "attribute", attribute_lm_node }, |
248 { "raw", llm_message_node_raw }, |
248 { "raw", raw_lm_node }, |
249 { "xml", llm_message_node_xml }, |
249 { "xml", xml_lm_node }, |
250 { "path", llm_message_node_path }, |
250 { "path", path_lm_node }, |
251 { "pointer", llm_message_node_pointer }, |
251 { "pointer", pointer_lm_node }, |
252 { "__gc", llm_message_node_gc }, |
252 { "__gc", gc_lm_node }, |
253 { NULL, NULL }, |
253 { NULL, NULL }, |
254 }; |
254 }; |
255 |
255 |
256 int luaopen_lm_message_node (lua_State *L) |
256 int luaopen_lm_message_node (lua_State *L) |
257 { |
257 { |
258 luaL_newmetatable (L, "loudmouth.message_node"); |
258 luaL_newmetatable (L, "loudmouth.message_node"); |
259 lua_pushstring (L, "__index"); |
259 lua_pushstring (L, "__index"); |
260 lua_pushvalue (L, -2); |
260 lua_pushvalue (L, -2); |
261 lua_settable (L, -3); |
261 lua_settable (L, -3); |
262 luaL_register (L, NULL, llm_message_node_reg_m); |
262 luaL_register (L, NULL, reg_m_lm_node); |
263 lua_pop (L, 1); |
263 lua_pop (L, 1); |
264 luaL_register (L, "lm.message_node", llm_message_node_reg_f); |
264 luaL_register (L, "lm.message_node", reg_f_lm_node); |
265 return 1; |
265 return 1; |
266 } |
266 } |
267 |
267 |