lm_message_node.c
changeset 11 a8c6460d612b
parent 8 951f92c66821
child 12 63f06a23c235
equal deleted inserted replaced
10:aed141accdd9 11:a8c6460d612b
    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);
   105 
   105 
   106 /// message_node:child
   106 /// message_node:child
   107 /// Gets or creates child node object with given name.
   107 /// Gets or creates child node object with given name.
   108 /// A: string (name), string (optional value)
   108 /// A: string (name), string (optional value)
   109 /// R: lm message node object or nil
   109 /// R: lm message node object or nil
   110 int llm_message_node_child (lua_State *L)
   110 int child_lm_node (lua_State *L)
   111 {
   111 {
   112 	LmMessageNode *node = luaL_checkLmMessageNode (L, 1);
   112 	LmMessageNode *node = luaL_checkLmMessageNode (L, 1);
   113 	const char *name = luaL_checkstring (L, 2);
   113 	const char *name = luaL_checkstring (L, 2);
   114 	LmMessageNode *child;
   114 	LmMessageNode *child;
   115 
   115 
   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));
   167 
   167 
   168 /// message_node:attribute
   168 /// message_node:attribute
   169 /// Gets or sets value of node attribute with a given name.
   169 /// Gets or sets value of node attribute with a given name.
   170 /// A: string (name), string (optional value)
   170 /// A: string (name), string (optional value)
   171 /// R: string (when called with one aprgument) or lm message node object
   171 /// R: string (when called with one aprgument) or lm message node object
   172 int llm_message_node_attribute (lua_State *L)
   172 int attribute_lm_node (lua_State *L)
   173 {
   173 {
   174 	LmMessageNode *node = luaL_checkLmMessageNode (L, 1);
   174 	LmMessageNode *node = luaL_checkLmMessageNode (L, 1);
   175 	const char *name = luaL_checkstring (L, 2);
   175 	const char *name = luaL_checkstring (L, 2);
   176 	if (lua_gettop (L) > 2) { // Set
   176 	if (lua_gettop (L) > 2) { // Set
   177 		lm_message_node_set_attribute (node, name, luaL_checkstring (L, 3));
   177 		lm_message_node_set_attribute (node, name, luaL_checkstring (L, 3));
   182 }
   182 }
   183 
   183 
   184 /// message_node:xml
   184 /// message_node:xml
   185 /// Returns node representation in xml.
   185 /// Returns node representation in xml.
   186 /// R: string
   186 /// R: string
   187 int llm_message_node_xml (lua_State *L)
   187 int xml_lm_node (lua_State *L)
   188 {
   188 {
   189 	LmMessageNode *node = luaL_checkLmMessageNode (L, 1);
   189 	LmMessageNode *node = luaL_checkLmMessageNode (L, 1);
   190 	lua_pushstring (L, lm_message_node_to_string (node));
   190 	lua_pushstring (L, lm_message_node_to_string (node));
   191 	return 1;
   191 	return 1;
   192 }
   192 }
   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