1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-25 20:36:38 +02:00

Add new functions in plugin API (hashtable_get_string, hook_info_hashtable, info_get_hashtable), add IRC info_hashtable "irc_parse_message"

Note: tcl >= 8.5 is now required (for tcl plugin).
This commit is contained in:
Sebastien Helleu
2010-08-27 15:59:06 +02:00
parent bb42984f5d
commit 712623547f
55 changed files with 3753 additions and 856 deletions
+121 -79
View File
@@ -68,12 +68,100 @@ char python_buffer_output[128];
/*
* weechat_python_exec: execute a Python script
* weechat_python_hashtable_map_cb: callback called for each key/value in a
* hashtable
*/
void
weechat_python_hashtable_map_cb (void *data,
struct t_hashtable *hashtable,
const void *key,
const void *value)
{
PyObject *dict, *dict_key, *dict_value;
/* make C compiler happy */
(void) hashtable;
dict = (PyObject *)data;
dict_key = Py_BuildValue ("s", (const char *)key);
dict_value = Py_BuildValue ("s", (const char *)value);
PyDict_SetItem (dict, dict_key, dict_value);
Py_DECREF (dict_key);
Py_DECREF (dict_value);
}
/*
* weechat_python_hashtable_to_dict: get python dictionary with a WeeChat
* hashtable
*/
PyObject *
weechat_python_hashtable_to_dict (struct t_hashtable *hashtable)
{
PyObject *dict;
dict = PyDict_New ();
if (!dict)
{
Py_INCREF(Py_None);
return Py_None;
}
weechat_hashtable_map (hashtable,
&weechat_python_hashtable_map_cb,
dict);
return dict;
}
/*
* weechat_python_dict_to_hashtable: get WeeChat hashtable with python
* dictionary
* Hashtable returned has type string for
* both keys and values
* Note: hashtable has to be released after
* use with call to weechat_hashtable_free()
*/
struct t_hashtable *
weechat_python_dict_to_hashtable (PyObject *dict, int hashtable_size)
{
struct t_hashtable *hashtable;
PyObject *key, *value;
Py_ssize_t pos;
char *str_key, *str_value;
hashtable = weechat_hashtable_new (hashtable_size,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL,
NULL);
if (!hashtable)
return NULL;
pos = 0;
while (PyDict_Next (dict, &pos, &key, &value))
{
str_key = PyString_AsString (key);
str_value = PyString_AsString (value);
weechat_hashtable_set (hashtable, (void *)str_key, (void *)str_value);
}
return hashtable;
}
/*
* weechat_python_exec: execute a python function
*/
void *
weechat_python_exec (struct t_plugin_script *script,
int ret_type, const char *function, char **argv)
int ret_type, const char *function,
char *format, void **argv)
{
struct t_plugin_script *old_python_current_script;
PyThreadState *old_interpreter;
@@ -81,8 +169,8 @@ weechat_python_exec (struct t_plugin_script *script,
PyObject *evDict;
PyObject *evFunc;
PyObject *rc;
void *ret_value;
int *ret_i;
void *argv2[16], *ret_value;
int i, argc, *ret_int;
/* PyEval_AcquireLock (); */
@@ -110,78 +198,28 @@ weechat_python_exec (struct t_plugin_script *script,
}
python_current_script = script;
if (argv && argv[0])
{
if (argv[1])
argc = strlen (format);
for (i = 0; i < 16; i++)
{
if (argv[2])
{
if (argv[3])
{
if (argv[4])
{
if (argv[5])
{
if (argv[6])
{
if (argv[7])
{
rc = PyObject_CallFunction (evFunc, "ssssssss",
argv[0], argv[1],
argv[2], argv[3],
argv[4], argv[5],
argv[6], argv[7]);
}
else
{
rc = PyObject_CallFunction (evFunc, "sssssss",
argv[0], argv[1],
argv[2], argv[3],
argv[4], argv[5],
argv[6]);
}
}
else
{
rc = PyObject_CallFunction (evFunc, "ssssss",
argv[0], argv[1],
argv[2], argv[3],
argv[4], argv[5]);
}
}
else
{
rc = PyObject_CallFunction (evFunc, "sssss",
argv[0], argv[1],
argv[2], argv[3],
argv[4]);
}
}
else
{
rc = PyObject_CallFunction (evFunc, "ssss", argv[0],
argv[1], argv[2], argv[3]);
}
}
else
{
rc = PyObject_CallFunction (evFunc, "sss", argv[0],
argv[1], argv[2]);
}
}
else
{
rc = PyObject_CallFunction (evFunc, "ss", argv[0], argv[1]);
}
}
else
{
rc = PyObject_CallFunction (evFunc, "s", argv[0]);
argv2[i] = (i < argc) ? argv[i] : NULL;
}
rc = PyObject_CallFunction (evFunc, format,
argv2[0], argv2[1],
argv2[2], argv2[3],
argv2[4], argv2[5],
argv2[6], argv2[7],
argv2[8], argv2[9],
argv2[10], argv2[11],
argv2[12], argv2[13],
argv2[14], argv2[15]);
}
else
{
rc = PyObject_CallFunction (evFunc, NULL);
}
ret_value = NULL;
@@ -197,22 +235,26 @@ weechat_python_exec (struct t_plugin_script *script,
PyErr_Print ();
Py_XDECREF(rc);
}
else if (PyString_Check (rc) && (ret_type == WEECHAT_SCRIPT_EXEC_STRING))
else if ((ret_type == WEECHAT_SCRIPT_EXEC_STRING) && (PyString_Check (rc)))
{
if (PyString_AsString (rc))
ret_value = strdup (PyString_AsString(rc));
else
ret_value = NULL;
Py_XDECREF(rc);
}
else if (PyInt_Check (rc) && (ret_type == WEECHAT_SCRIPT_EXEC_INT))
else if ((ret_type == WEECHAT_SCRIPT_EXEC_INT) && (PyInt_Check (rc)))
{
ret_i = malloc (sizeof (*ret_i));
if (ret_i)
*ret_i = (int) PyInt_AsLong(rc);
ret_value = ret_i;
ret_int = malloc (sizeof (*ret_int));
if (ret_int)
*ret_int = (int) PyInt_AsLong(rc);
ret_value = ret_int;
Py_XDECREF(rc);
}
else if (ret_type == WEECHAT_SCRIPT_EXEC_HASHTABLE)
{
ret_value = weechat_python_dict_to_hashtable (rc,
WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE);
Py_XDECREF(rc);
}
else
@@ -241,7 +283,7 @@ weechat_python_exec (struct t_plugin_script *script,
}
/*
* weechat_python_output : redirection for stdout and stderr
* weechat_python_output: redirection for stdout and stderr
*/
static PyObject *
@@ -552,7 +594,7 @@ weechat_python_unload (struct t_plugin_script *script)
if (script->shutdown_func && script->shutdown_func[0])
{
r = (int *) weechat_python_exec (script, WEECHAT_SCRIPT_EXEC_INT,
script->shutdown_func, NULL);
script->shutdown_func, NULL, NULL);
if (r)
free (r);
}