# HG changeset patch # User Myhailo Danylenko # Date 1235213031 -7200 # Node ID 5db1448eb857f96b8abad4d489aa1cd91219e728 # Parent 90073cbb535df176d21428f15d1ddef4c1d56674 Message have node methods diff -r 90073cbb535d -r 5db1448eb857 CMakeLists.txt --- a/CMakeLists.txt Fri Feb 20 23:07:43 2009 +0200 +++ b/CMakeLists.txt Sat Feb 21 12:43:51 2009 +0200 @@ -52,7 +52,7 @@ ## Extra targets if(PERL_FOUND) - add_custom_command(OUTPUT ${lua-lm_BINARY_DIR}/loudmouth.html COMMAND ${lua-lm_SOURCE_DIR}/docgen.pl ${lua-lm_SOURCES} > ${lua-lm_BINARY_DIR}/loudmouth.html DEPENDS ${lua-lm_SOURCE_DIR}/docgen.pl ${lua-lm_SOURCES} WORKING_DIRECTORY ${lua-lm_SOURCE_DIR}) + add_custom_command(OUTPUT ${lua-lm_BINARY_DIR}/loudmouth.html COMMAND ${PERL_EXECUTABLE} ${lua-lm_SOURCE_DIR}/docgen.pl ${lua-lm_SOURCES} > ${lua-lm_BINARY_DIR}/loudmouth.html DEPENDS ${lua-lm_SOURCE_DIR}/docgen.pl ${lua-lm_SOURCES} WORKING_DIRECTORY ${lua-lm_SOURCE_DIR}) add_custom_target(doc ALL DEPENDS ${lua-lm_BINARY_DIR}/loudmouth.html) endif() add_custom_target(test COMMAND env "LUA_PATH=${lua-lm_SOURCE_DIR}/?.lua;${LUA_PATH}" "LUA_CPATH=${lua-lm_SOURCE_DIR}/?.so;${lua-lm_BINARY_DIR}/?.so;${LUA_CPATH}" lua ${lua-lm_SOURCE_DIR}/test.lua DEPENDS loudmouth VERBATIM) diff -r 90073cbb535d -r 5db1448eb857 TODO --- a/TODO Fri Feb 20 23:07:43 2009 +0200 +++ b/TODO Sat Feb 21 12:43:51 2009 +0200 @@ -1,4 +1,5 @@ Verify refcounts of lm objects. Need a decent test script for that. Some additional lua functions? +Path node/message method to traverse path and return nil or node diff -r 90073cbb535d -r 5db1448eb857 lm.c --- a/lm.c Fri Feb 20 23:07:43 2009 +0200 +++ b/lm.c Sat Feb 21 12:43:51 2009 +0200 @@ -21,8 +21,8 @@ lua_rawset (L, LUA_REGISTRYINDEX); // 0 lua_createtable (L, 6, 0); -// lua_pushvalue (L, -1); -// lua_setglobal (L, "lm"); + lua_pushvalue (L, -1); + lua_setglobal (L, "lm"); luaopen_lm_message_node (L); luaopen_lm_message (L); diff -r 90073cbb535d -r 5db1448eb857 lm.lua --- a/lm.lua Fri Feb 20 23:07:43 2009 +0200 +++ b/lm.lua Sat Feb 21 12:43:51 2009 +0200 @@ -1,5 +1,5 @@ -lm = require 'loudmouth' +require 'loudmouth' -- argument is a table with keys, -- corresponding to method names. @@ -149,7 +149,7 @@ return c else - error ( "at least server name parameter required" ) + error "at least server name parameter required" end end @@ -222,7 +222,7 @@ end a.to = nil a.mtype = nil - lm.message_node.fill ( m:node(), a ) + lm.message_node.fill ( m, a ) return m end @@ -244,17 +244,16 @@ -- There are NO WAY to get a list of node attributes, -- except brute force... function lm.message.parse ( message ) - local node = message:node () local mtype, subtype = message:type () if subtype then mtype = mtype .. '-' .. subtype end local r = { mtype = mtype } - local value = node:value () + local value = message:value () if value then r[1] = value end - lm.message_node.parse ( node, r ) + lm.message_node.parse ( message, r ) return r end diff -r 90073cbb535d -r 5db1448eb857 lm_message.c --- a/lm_message.c Fri Feb 20 23:07:43 2009 +0200 +++ b/lm_message.c Sat Feb 21 12:43:51 2009 +0200 @@ -6,6 +6,7 @@ #include "config.h" #include "util.h" #include "lm_types.h" +#include "lm_message_node.h" /// lm.message /// Module, representing individual message. @@ -104,9 +105,6 @@ return 1; } -// XXX: add node methods here to allow omitting of :node(): element -// BTW, we can jus adapt node methods to work on messages too and register them here also - /// message:type /// Returns two strings: message type and message sub type. /// R: message type, message sub type @@ -143,11 +141,23 @@ }; static const luaL_Reg llm_message_reg_m[] = { - { "node", llm_message_node }, - { "type", llm_message_kind }, - { "pointer", llm_message_pointer }, - { "__gc", llm_message_gc }, - { NULL, NULL }, + { "node", llm_message_node }, + { "type", llm_message_kind }, + // These methods are common for message and message node + { "next", llm_message_node_next }, + { "prev", llm_message_node_prev }, + { "children", llm_message_node_children }, + { "parent", llm_message_node_parent }, + { "value", llm_message_node_value }, + { "child", llm_message_node_child }, + { "find_child", llm_message_node_find_child }, + { "attribute", llm_message_node_attribute }, + { "raw", llm_message_node_raw }, + { "xml", llm_message_node_xml }, + // End common methods + { "pointer", llm_message_pointer }, + { "__gc", llm_message_gc }, + { NULL, NULL }, }; int luaopen_lm_message (lua_State *L) diff -r 90073cbb535d -r 5db1448eb857 lm_message_node.c --- a/lm_message_node.c Fri Feb 20 23:07:43 2009 +0200 +++ b/lm_message_node.c Sat Feb 21 12:43:51 2009 +0200 @@ -24,22 +24,22 @@ /// message_node:name /// Gets a name of message node. /// R: string -static int llm_message_node_name (lua_State *L) +int llm_message_node_name (lua_State *L) { - llm_message_node_t *object = luaL_checklm_message_node (L, 1); - lua_pushstring (L, object->message_node->name); + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); + lua_pushstring (L, node->name); return 1; } /// message_node:next /// Gets next message node. /// R: lm message node object or nil -static int llm_message_node_next (lua_State *L) +int llm_message_node_next (lua_State *L) { - llm_message_node_t *object = luaL_checklm_message_node (L, 1); - LmMessageNode *node = object->message_node->next; - if (node) - llm_message_node_bless (L, node); + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); + LmMessageNode *next = node->next; + if (next) + llm_message_node_bless (L, next); else lua_pushnil (L); return 1; @@ -48,12 +48,12 @@ /// message_node:prev /// Gets previous message node. /// R: lm message node object or nil -static int llm_message_node_prev (lua_State *L) +int llm_message_node_prev (lua_State *L) { - llm_message_node_t *object = luaL_checklm_message_node (L, 1); - LmMessageNode *node = object->message_node->prev; - if (node) - llm_message_node_bless (L, node); + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); + LmMessageNode *prev = node->prev; + if (prev) + llm_message_node_bless (L, prev); else lua_pushnil (L); return 1; @@ -62,12 +62,12 @@ /// message_node:children /// Gets first child node (raw access used). /// R: lm message node object or nil -static int llm_message_node_children (lua_State *L) +int llm_message_node_children (lua_State *L) { - llm_message_node_t *object = luaL_checklm_message_node (L, 1); - LmMessageNode *node = object->message_node->children; - if (node) - llm_message_node_bless (L, node); + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); + LmMessageNode *child = node->children; + if (child) + llm_message_node_bless (L, child); else lua_pushnil (L); return 1; @@ -76,12 +76,12 @@ /// message_node:parent /// Gets parent message node. /// R: lm message node object or nil -static int llm_message_node_parent (lua_State *L) +int llm_message_node_parent (lua_State *L) { - llm_message_node_t *object = luaL_checklm_message_node (L, 1); - LmMessageNode *node = object->message_node->parent; - if (node) - llm_message_node_bless (L, node); + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); + LmMessageNode *parent = node->parent; + if (parent) + llm_message_node_bless (L, parent); else lua_pushnil (L); return 1; @@ -91,15 +91,15 @@ /// Gets or sets a value of message node. /// A: string (optional value) /// R: string (if called without arguments) or lm message node object -static int llm_message_node_value (lua_State *L) +int llm_message_node_value (lua_State *L) { - llm_message_node_t *object = luaL_checklm_message_node (L, 1); + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); if (lua_gettop (L) > 1) { // Set const char *value = luaL_checkstring (L, 2); - lm_message_node_set_value (object->message_node, value); + lm_message_node_set_value (node, value); lua_pop (L, 1); } else // Get - lua_pushstring (L, lm_message_node_get_value (object->message_node)); + lua_pushstring (L, lm_message_node_get_value (node)); return 1; } @@ -107,17 +107,17 @@ /// Gets or creates child node object with given name. /// A: string (name), string (optional value) /// R: lm message node object or nil -static int llm_message_node_child (lua_State *L) +int llm_message_node_child (lua_State *L) { - llm_message_node_t *object = luaL_checklm_message_node (L, 1); + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); const char *name = luaL_checkstring (L, 2); LmMessageNode *child; if (lua_gettop (L) > 2) // Add - child = lm_message_node_add_child (object->message_node, name, + child = lm_message_node_add_child (node, name, luaL_checkstring (L, 3)); else { // Get - child = lm_message_node_get_child (object->message_node, name); + child = lm_message_node_get_child (node, name); if (!child) { lua_pushnil (L); return 1; @@ -132,13 +132,13 @@ /// Searches for node with a given name over all node subtree. /// A: string (name) /// R: lm message node object or nil -static int llm_message_node_find_child (lua_State *L) +int llm_message_node_find_child (lua_State *L) { - llm_message_node_t *object = luaL_checklm_message_node (L, 1); + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); const char *name = luaL_checkstring (L, 2); LmMessageNode *child; - child = lm_message_node_get_child (object->message_node, name); + child = lm_message_node_get_child (node, name); if (!child) lua_pushnil (L); else { @@ -153,15 +153,15 @@ /// When set, value of node will not be escaped. /// A: boolean (optional) /// V: boolean (if called with no apguments) or lm message node object -static int llm_message_node_raw (lua_State *L) +int llm_message_node_raw (lua_State *L) { - llm_message_node_t *object = luaL_checklm_message_node (L, 1); + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); if (lua_gettop (L) > 1) { // Set luaL_checktype (L, 2, LUA_TBOOLEAN); - lm_message_node_set_raw_mode (object->message_node, lua_toboolean (L, 2)); + lm_message_node_set_raw_mode (node, lua_toboolean (L, 2)); lua_pop (L, 1); } else // Get - lua_pushboolean (L, lm_message_node_get_raw_mode (object->message_node)); + lua_pushboolean (L, lm_message_node_get_raw_mode (node)); return 1; } @@ -169,25 +169,25 @@ /// Gets or sets value of node attribute with a given name. /// A: string (name), string (optional value) /// R: string (when called with one aprgument) or lm message node object -static int llm_message_node_attribute (lua_State *L) +int llm_message_node_attribute (lua_State *L) { - llm_message_node_t *object = luaL_checklm_message_node (L, 1); + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); const char *name = luaL_checkstring (L, 2); if (lua_gettop (L) > 2) { // Set - lm_message_node_set_attribute (object->message_node, name, luaL_checkstring (L, 3)); + lm_message_node_set_attribute (node, name, luaL_checkstring (L, 3)); lua_pop (L, 2); } else // Get - lua_pushstring (L, lm_message_node_get_attribute (object->message_node, name)); + lua_pushstring (L, lm_message_node_get_attribute (node, name)); return 1; } /// message_node:xml /// Returns node representation in xml. /// R: string -static int llm_message_node_xml (lua_State *L) +int llm_message_node_xml (lua_State *L) { - llm_message_node_t *object = luaL_checklm_message_node (L, 1); - lua_pushstring (L, lm_message_node_to_string (object->message_node)); + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); + lua_pushstring (L, lm_message_node_to_string (node)); return 1; } diff -r 90073cbb535d -r 5db1448eb857 lm_message_node.h --- a/lm_message_node.h Fri Feb 20 23:07:43 2009 +0200 +++ b/lm_message_node.h Sat Feb 21 12:43:51 2009 +0200 @@ -4,6 +4,18 @@ #include +int llm_message_node_name (lua_State *L); +int llm_message_node_next (lua_State *L); +int llm_message_node_prev (lua_State *L); +int llm_message_node_children (lua_State *L); +int llm_message_node_parent (lua_State *L); +int llm_message_node_value (lua_State *L); +int llm_message_node_child (lua_State *L); +int llm_message_node_find_child (lua_State *L); +int llm_message_node_raw (lua_State *L); +int llm_message_node_attribute (lua_State *L); +int llm_message_node_xml (lua_State *L); + int luaopen_lm_message_node (lua_State *L); #endif diff -r 90073cbb535d -r 5db1448eb857 lm_types.c --- a/lm_types.c Fri Feb 20 23:07:43 2009 +0200 +++ b/lm_types.c Sat Feb 21 12:43:51 2009 +0200 @@ -62,5 +62,23 @@ LLM_DEFINE (proxy, LmProxy) LLM_DEFINE (ssl, LmSSL) +LmMessageNode *luaL_checkLmMessageNode (lua_State *L, int index) +{ + void *object; + luaL_argcheck (L, lua_type (L, index) == LUA_TUSERDATA, index, "loudmouth message or message node expected"); + object = lua_touserdata (L, index); + lua_getmetatable (L, index); + luaL_getmetatable (L, "loudmouth.message"); + luaL_getmetatable (L, "loudmouth.message_node"); + if (lua_rawequal (L, -2, -3)) // Message + object = (void *) lm_message_get_node (((llm_message_t *) object)->message); + else if (lua_rawequal (L, -1, -3)) // Node + object = (void *) (((llm_message_node_t *) object)->message_node); + else + luaL_argerror (L, index, "loudmouth message or message node expected"); + lua_pop (L, 3); + return (LmMessageNode *) object; +} + #undef LLM_DEFINE diff -r 90073cbb535d -r 5db1448eb857 lm_types.h --- a/lm_types.h Fri Feb 20 23:07:43 2009 +0200 +++ b/lm_types.h Sat Feb 21 12:43:51 2009 +0200 @@ -31,6 +31,8 @@ LLM_DECLARE (proxy, LmProxy) LLM_DECLARE (ssl, LmSSL) +LmMessageNode *luaL_checkLmMessageNode (lua_State *L, int index); + #undef LLM_DECLARE #endif