aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2009-09-04 15:53:10 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2009-09-04 15:53:10 +0400
commit36e8776498484a27af13a623ca1c78603ba6c7f6 (patch)
treea856763a5f7f181085de21eff5ddeb825f7567c9
parent3215a8457fcedcbc400a9447d06c7f54b0af35a4 (diff)
downloadrspamd-36e8776498484a27af13a623ca1c78603ba6c7f6.tar.gz
rspamd-36e8776498484a27af13a623ca1c78603ba6c7f6.zip
* More fixes to lua api
-rw-r--r--src/lua/lua_common.c88
-rw-r--r--src/lua/lua_common.h1
-rw-r--r--src/lua/lua_config.c11
-rw-r--r--src/lua/lua_message.c3
-rw-r--r--src/lua/lua_task.c17
5 files changed, 81 insertions, 39 deletions
diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c
index 0480ea1b6..b52e88df2 100644
--- a/src/lua/lua_common.c
+++ b/src/lua/lua_common.c
@@ -29,20 +29,22 @@
lua_State *L = NULL;
const luaL_reg null_reg[] = {
+ {"__tostring", lua_class_tostring},
{NULL, NULL}
};
/* Logger methods */
-LUA_FUNCTION_DEF(logger, _err);
-LUA_FUNCTION_DEF(logger, _warn);
-LUA_FUNCTION_DEF(logger, _info);
-LUA_FUNCTION_DEF(logger, _debug);
+LUA_FUNCTION_DEF(logger, err);
+LUA_FUNCTION_DEF(logger, warn);
+LUA_FUNCTION_DEF(logger, info);
+LUA_FUNCTION_DEF(logger, debug);
static const struct luaL_reg loggerlib_m[] = {
- LUA_INTERFACE_DEF(logger, _err),
- LUA_INTERFACE_DEF(logger, _warn),
- LUA_INTERFACE_DEF(logger, _info),
- LUA_INTERFACE_DEF(logger, _debug),
+ LUA_INTERFACE_DEF(logger, err),
+ LUA_INTERFACE_DEF(logger, warn),
+ LUA_INTERFACE_DEF(logger, info),
+ LUA_INTERFACE_DEF(logger, debug),
+ {"__tostring", lua_class_tostring},
{NULL, NULL}
};
@@ -51,24 +53,51 @@ void
lua_newclass (lua_State *L, const char *classname, const struct luaL_reg *func)
{
luaL_newmetatable (L, classname); /* mt */
- /* create __index table to place methods */
- lua_pushstring (L, "__index"); /* mt,"__index" */
- lua_newtable (L); /* mt,"__index",it */
- /* put class name into class metatable */
+ lua_pushstring(L, "__index");
+ lua_pushvalue(L, -2); /* pushes the metatable */
+ lua_settable(L, -3); /* metatable.__index = metatable */
+
lua_pushstring (L, "class"); /* mt,"__index",it,"class" */
lua_pushstring (L, classname); /* mt,"__index",it,"class",classname */
lua_rawset (L, -3); /* mt,"__index",it */
- /* pass all methods that start with _ to the metatable, and all others
- * to the index table */
- for (; func->name; func++) { /* mt,"__index",it */
- lua_pushstring (L, func->name);
- lua_pushcfunction (L, func->func);
- lua_rawset (L, func->name[0] == '_' ? -5: -3);
+
+ luaL_openlib(L, NULL, func, 0);
+}
+
+int
+lua_class_tostring (lua_State *L)
+{
+ char buf[32];
+
+ if (!lua_getmetatable (L, 1)) {
+ goto error;
+ }
+ lua_pushstring (L, "__index");
+ lua_gettable (L, -2);
+
+ if (!lua_istable (L, -1)) {
+ goto error;
}
- lua_rawset (L, -3); /* mt */
- lua_pop (L, 1);
+ lua_pushstring (L, "class");
+ lua_gettable (L, -2);
+
+ if (!lua_isstring (L, -1)) {
+ goto error;
+ }
+
+ snprintf (buf, sizeof (buf), "%p", lua_touserdata (L, 1));
+
+ lua_pushfstring (L, "%s: %s", lua_tostring (L, -1), buf);
+
+ return 1;
+
+error:
+ lua_pushstring (L, "invalid object passed to 'lua_common.c:__tostring'");
+ lua_error (L);
+ return 1;
}
+
void
lua_setclass (lua_State *L, const char *classname, int objidx)
{
@@ -92,37 +121,37 @@ lua_set_table_index (lua_State *L, const char *index, const char *value)
/*** Logger interface ***/
static int
-lua_logger__err (lua_State *L)
+lua_logger_err (lua_State *L)
{
const char *msg;
- msg = luaL_checkstring (L, 2);
+ msg = luaL_checkstring (L, 1);
msg_err (msg);
return 1;
}
static int
-lua_logger__warn (lua_State *L)
+lua_logger_warn (lua_State *L)
{
const char *msg;
- msg = luaL_checkstring (L, 2);
+ msg = luaL_checkstring (L, 1);
msg_warn (msg);
return 1;
}
static int
-lua_logger__info (lua_State *L)
+lua_logger_info (lua_State *L)
{
const char *msg;
- msg = luaL_checkstring (L, 2);
+ msg = luaL_checkstring (L, 1);
msg_info (msg);
return 1;
}
static int
-lua_logger__debug (lua_State *L)
+lua_logger_debug (lua_State *L)
{
const char *msg;
- msg = luaL_checkstring (L, 2);
+ msg = luaL_checkstring (L, 1);
msg_debug (msg);
return 1;
}
@@ -146,8 +175,7 @@ int
luaopen_logger (lua_State *L)
{
- lua_newclass (L, "rspamd{logger}", loggerlib_m);
- luaL_openlib (L, NULL, null_reg, 0);
+ luaL_openlib (L, "rspamd_logger", loggerlib_m, 0);
return 1;
}
diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h
index 886960ab3..ff475c0a1 100644
--- a/src/lua/lua_common.h
+++ b/src/lua/lua_common.h
@@ -17,6 +17,7 @@ extern const luaL_reg null_reg[];
void lua_newclass (lua_State *L, const char *classname, const struct luaL_reg *func);
void lua_setclass (lua_State *L, const char *classname, int objidx);
void lua_set_table_index (lua_State *L, const char *index, const char *value);
+int lua_class_tostring (lua_State *L);
int luaopen_message (lua_State *L);
int luaopen_task (lua_State *L);
int luaopen_config (lua_State *L);
diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c
index 0879cf835..edd2bc6ea 100644
--- a/src/lua/lua_config.c
+++ b/src/lua/lua_config.c
@@ -34,6 +34,7 @@ static const struct luaL_reg configlib_m[] = {
LUA_INTERFACE_DEF(config, get_module_opt),
LUA_INTERFACE_DEF(config, get_metric),
LUA_INTERFACE_DEF(config, get_all_opt),
+ {"__tostring", lua_class_tostring},
{NULL, NULL}
};
@@ -42,6 +43,7 @@ LUA_FUNCTION_DEF(metric, register_symbol);
static const struct luaL_reg metriclib_m[] = {
LUA_INTERFACE_DEF(metric, register_symbol),
+ {"__tostring", lua_class_tostring},
{NULL, NULL}
};
@@ -177,7 +179,8 @@ lua_metric_register_symbol (lua_State *L)
callback = luaL_checkstring (L, 4);
if (name) {
cd = g_malloc (sizeof (struct lua_callback_data));
- cd->name = g_strdup (name);
+ cd->name = g_strdup (callback);
+ cd->L = L;
register_symbol (&metric->cache, name, weight, lua_metric_symbol_callback, cd);
}
}
@@ -188,7 +191,7 @@ int
luaopen_config (lua_State *L)
{
lua_newclass (L, "rspamd{config}", configlib_m);
- luaL_openlib (L, NULL, null_reg, 0);
+ luaL_openlib (L, "rspamd_config", null_reg, 0);
return 1;
}
@@ -196,8 +199,8 @@ luaopen_config (lua_State *L)
int
luaopen_metric (lua_State *L)
{
- lua_newclass (L, "rspamd{metric}", configlib_m);
- luaL_openlib (L, NULL, null_reg, 0);
+ lua_newclass (L, "rspamd{metric}", metriclib_m);
+ luaL_openlib (L, "rspamd_metric", null_reg, 0);
return 1;
}
diff --git a/src/lua/lua_message.c b/src/lua/lua_message.c
index a99fa070c..bef809230 100644
--- a/src/lua/lua_message.c
+++ b/src/lua/lua_message.c
@@ -79,6 +79,7 @@ static const struct luaL_reg msglib_m[] = {
LUA_INTERFACE_DEF(message, set_reply_to),
LUA_INTERFACE_DEF(message, get_header),
LUA_INTERFACE_DEF(message, set_header),
+ {"__tostring", lua_class_tostring},
{NULL, NULL}
};
@@ -167,7 +168,7 @@ int
luaopen_message (lua_State *L)
{
lua_newclass (L, "rspamd{message}", msglib_m);
- luaL_openlib (L, NULL, null_reg, 0);
+ luaL_openlib (L, "rspamd_message", null_reg, 0);
return 1;
}
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index e89572144..6a6ce5bde 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -37,6 +37,7 @@ static const struct luaL_reg tasklib_m[] = {
LUA_INTERFACE_DEF(task, insert_result),
LUA_INTERFACE_DEF(task, get_urls),
LUA_INTERFACE_DEF(task, get_text_parts),
+ {"__tostring", lua_class_tostring},
{NULL, NULL}
};
@@ -51,6 +52,7 @@ static const struct luaL_reg textpartlib_m[] = {
LUA_INTERFACE_DEF(textpart, is_empty),
LUA_INTERFACE_DEF(textpart, is_html),
LUA_INTERFACE_DEF(textpart, get_fuzzy),
+ {"__tostring", lua_class_tostring},
{NULL, NULL}
};
@@ -106,15 +108,18 @@ lua_task_insert_result (lua_State *L)
static int
lua_task_get_urls (lua_State *L)
{
+ int i = 1;
struct worker_task *task = lua_check_task (L);
GList *cur;
struct uri *url;
if (task != NULL) {
+ lua_newtable (L);
cur = g_list_first (task->urls);
while (cur) {
url = cur->data;
lua_pushstring (L, struri (url));
+ lua_rawseti(L, -2, i++);
cur = g_list_next (cur);
}
}
@@ -125,20 +130,24 @@ lua_task_get_urls (lua_State *L)
static int
lua_task_get_text_parts (lua_State *L)
{
-
+ int i = 1;
struct worker_task *task = lua_check_task (L);
GList *cur;
struct mime_text_part *part, **ppart;
if (task != NULL) {
+ lua_newtable (L);
cur = task->text_parts;
while (cur) {
part = cur->data;
ppart = lua_newuserdata (L, sizeof (struct mime_text_part *));
- lua_setclass (L, "rspamd{textpart}", -1);
*ppart = part;
+ lua_setclass (L, "rspamd{textpart}", -1);
+ /* Make it array */
+ lua_rawseti(L, -2, i++);
cur = g_list_next (cur);
}
+ return 1;
}
lua_pushnil (L);
return 1;
@@ -210,7 +219,7 @@ int
luaopen_task (lua_State *L)
{
lua_newclass (L, "rspamd{task}", tasklib_m);
- luaL_openlib (L, NULL, null_reg, 0);
+ luaL_openlib (L, "rspamd_task", null_reg, 0);
return 1;
}
@@ -219,7 +228,7 @@ int
luaopen_textpart (lua_State *L)
{
lua_newclass (L, "rspamd{textpart}", textpartlib_m);
- luaL_openlib (L, NULL, null_reg, 0);
+ luaL_openlib (L, "rspamd_textpart", null_reg, 0);
return 1;
}