diff --git a/cmake/FindPython.cmake b/cmake/FindPython.cmake index 3868fcc..9d66f8e 100644 --- a/cmake/FindPython.cmake +++ b/cmake/FindPython.cmake @@ -40,17 +40,17 @@ FIND_PROGRAM(PYTHON_EXECUTABLE IF(PYTHON_EXECUTABLE) EXECUTE_PROCESS( - COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import *; print get_config_var('CONFINCLUDEPY')" + COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import *; print(get_config_var('CONFINCLUDEPY'))" OUTPUT_VARIABLE PYTHON_INC_DIR ) EXECUTE_PROCESS( - COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import *; print get_config_var('LIBPL')" + COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import *; print(get_config_var('LIBPL'))" OUTPUT_VARIABLE PYTHON_POSSIBLE_LIB_PATH ) EXECUTE_PROCESS( - COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import *; print get_config_var('LINKFORSHARED')" + COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import *; print(get_config_var('LINKFORSHARED'))" OUTPUT_VARIABLE PYTHON_LFLAGS ) diff --git a/src/plugins/scripts/python/weechat-python-api.c b/src/plugins/scripts/python/weechat-python-api.c index dc3ece4..293f046 100644 --- a/src/plugins/scripts/python/weechat-python-api.c +++ b/src/plugins/scripts/python/weechat-python-api.c @@ -50,8 +50,8 @@ python_function_name); \ __ret; \ } -#define API_RETURN_OK return Py_BuildValue ("i", 1); -#define API_RETURN_ERROR return Py_BuildValue ("i", 0); +#define API_RETURN_OK return PyLong_FromLong((long)1); +#define API_RETURN_ERROR return PyLong_FromLong ((long)0); #define API_RETURN_EMPTY \ Py_INCREF (Py_None); \ return Py_None; @@ -68,9 +68,9 @@ } \ return Py_BuildValue ("s", "") #define API_RETURN_INT(__int) \ - return Py_BuildValue ("i", __int); + return PyLong_FromLong((long)__int); #define API_RETURN_LONG(__long) \ - return Py_BuildValue ("l", __long); + return PyLong_FromLong(__long); #define API_DEF_FUNC(__name) \ { #__name, &weechat_python_api_##__name, METH_VARARGS, "" } diff --git a/src/plugins/scripts/python/weechat-python.c b/src/plugins/scripts/python/weechat-python.c index db09cc3..90b4579 100644 --- a/src/plugins/scripts/python/weechat-python.c +++ b/src/plugins/scripts/python/weechat-python.c @@ -52,6 +52,39 @@ const char *python_current_script_filename = NULL; PyThreadState *python_mainThreadState = NULL; char *python2_bin = NULL; +/* outputs subroutines */ +static PyObject *weechat_python_output (PyObject *self, PyObject *args); +static PyMethodDef weechat_python_output_funcs[] = { + { "write", weechat_python_output, METH_VARARGS, "" }, + { NULL, NULL, 0, NULL } +}; + +#if PY_MAJOR_VERSION >= 3 +/* module definition for python >= 3.x */ +static struct PyModuleDef moduleDef = { + PyModuleDef_HEAD_INIT, + "weechat", + NULL, + -1, + weechat_python_funcs, + NULL, + NULL, + NULL, + NULL +}; +static struct PyModuleDef moduleDefOutputs = { + PyModuleDef_HEAD_INIT, + "weechatOutputs", + NULL, + -1, + weechat_python_output_funcs, + NULL, + NULL, + NULL, + NULL +}; +#endif + /* * string used to execute action "install": * when signal "python_install_script" is received, name of string @@ -120,6 +153,31 @@ weechat_python_set_python2_bin () } /* + * weechat_python_unicode_to_string: convert a python unicode to a C UTF-8 + * string + * Note: result has to be freed after use + */ + +char * +weechat_python_unicode_to_string (PyObject *obj) +{ + PyObject *utf8string; + char *str; + + str = NULL; + + utf8string = PyUnicode_AsUTF8String (obj); + if (utf8string) + { + if (PyBytes_AsString (utf8string)) + str = strdup (PyBytes_AsString (utf8string)); + Py_XDECREF(utf8string); + } + + return str; +} + +/* * weechat_python_hashtable_map_cb: callback called for each key/value in a * hashtable */ @@ -198,9 +256,30 @@ weechat_python_dict_to_hashtable (PyObject *dict, int hashtable_size) pos = 0; while (PyDict_Next (dict, &pos, &key, &value)) { - str_key = PyString_AsString (key); - str_value = PyString_AsString (value); - weechat_hashtable_set (hashtable, str_key, str_value); + str_key = NULL; + str_value = NULL; + if (PyBytes_Check (key)) + { + if (PyBytes_AsString (key)) + str_key = strdup (PyBytes_AsString (key)); + } + else + str_key = weechat_python_unicode_to_string (key); + if (PyBytes_Check (value)) + { + if (PyBytes_AsString (value)) + str_value = strdup (PyBytes_AsString (value)); + } + else + str_value = weechat_python_unicode_to_string (value); + + if (str_key) + weechat_hashtable_set (hashtable, str_key, str_value); + + if (str_key) + free (str_key); + if (str_value) + free (str_value); } return hashtable; @@ -217,10 +296,7 @@ weechat_python_exec (struct t_plugin_script *script, { struct t_plugin_script *old_python_current_script; PyThreadState *old_interpreter; - PyObject *evMain; - PyObject *evDict; - PyObject *evFunc; - PyObject *rc; + PyObject *evMain, *evDict, *evFunc, *rc; void *argv2[16], *ret_value; int i, argc, *ret_int; @@ -280,26 +356,31 @@ weechat_python_exec (struct t_plugin_script *script, * because of '#define WEECHAT_RC_OK 0' */ if (rc == NULL) - rc = PyInt_FromLong (0); + rc = PyLong_FromLong ((long)0); if (PyErr_Occurred()) { PyErr_Print (); Py_XDECREF(rc); } - else if ((ret_type == WEECHAT_SCRIPT_EXEC_STRING) && (PyString_Check (rc))) + else if ((ret_type == WEECHAT_SCRIPT_EXEC_STRING) && (PyUnicode_Check (rc))) { - if (PyString_AsString (rc)) - ret_value = strdup (PyString_AsString(rc)); + ret_value = weechat_python_unicode_to_string (rc); + Py_XDECREF(rc); + } + else if ((ret_type == WEECHAT_SCRIPT_EXEC_STRING) && (PyBytes_Check (rc))) + { + if (PyBytes_AsString (rc)) + ret_value = strdup (PyBytes_AsString (rc)); else ret_value = NULL; Py_XDECREF(rc); } - else if ((ret_type == WEECHAT_SCRIPT_EXEC_INT) && (PyInt_Check (rc))) + else if ((ret_type == WEECHAT_SCRIPT_EXEC_INT) && (PyLong_Check (rc))) { ret_int = malloc (sizeof (*ret_int)); if (ret_int) - *ret_int = (int) PyInt_AsLong(rc); + *ret_int = (int) PyLong_AsLong(rc); ret_value = ret_int; Py_XDECREF(rc); } @@ -317,7 +398,7 @@ weechat_python_exec (struct t_plugin_script *script, weechat_prefix ("error"), PYTHON_PLUGIN_NAME, function); } - if (ret_value == NULL) + if (!ret_value) { weechat_printf (NULL, weechat_gettext ("%s%s: error in function \"%s\""), @@ -391,16 +472,6 @@ weechat_python_output (PyObject *self, PyObject *args) } /* - * Outputs subroutines - */ - -static -PyMethodDef weechat_python_output_funcs[] = { - { "write", weechat_python_output, METH_VARARGS, "" }, - { NULL, NULL, 0, NULL } -}; - -/* * weechat_python_load: load a Python script */ @@ -408,12 +479,15 @@ int weechat_python_load (const char *filename) { char *argv[] = { "__weechat_plugin__" , NULL }; +#if PY_MAJOR_VERSION >= 3 + wchar_t *wargv[] = { NULL, NULL }; +#endif FILE *fp; PyThreadState *python_current_interpreter; PyObject *weechat_module, *weechat_outputs, *weechat_dict; PyObject *python_path, *path; const char *weechat_home; - char *p_home; + char *str_home; int len; if ((fp = fopen (filename, "r")) == NULL) @@ -436,9 +510,27 @@ weechat_python_load (const char *filename) /* PyEval_AcquireLock (); */ python_current_interpreter = Py_NewInterpreter (); +#if PY_MAJOR_VERSION >= 3 + /* python >= 3.x */ + len = strlen (argv[0]); + wargv[0] = malloc ((len + 1) * sizeof (wargv[0][0])); + if (wargv[0]) + { + if (mbstowcs (wargv[0], argv[0], len) == (size_t)(-1)) + { + free (wargv[0]); + wargv[0] = NULL; + } + PySys_SetArgv(1, wargv); + if (wargv[0]) + free (wargv[0]); + } +#else + /* python <= 2.x */ PySys_SetArgv(1, argv); +#endif - if (python_current_interpreter == NULL) + if (!python_current_interpreter) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " @@ -451,9 +543,15 @@ weechat_python_load (const char *filename) PyThreadState_Swap (python_current_interpreter); +#if PY_MAJOR_VERSION >= 3 + /* python >= 3.x */ + weechat_module = PyModule_Create (&moduleDef); +#else + /* python <= 2.x */ weechat_module = Py_InitModule ("weechat", weechat_python_funcs); +#endif - if ( weechat_module == NULL) + if (!weechat_module) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to initialize WeeChat " @@ -472,71 +570,78 @@ weechat_python_load (const char *filename) weechat_home = weechat_info_get ("weechat_dir", ""); if (weechat_home) { - len = strlen (weechat_home) + 1 + strlen(PYTHON_PLUGIN_NAME) + 1; - p_home = malloc (len); - if (p_home) + len = strlen (weechat_home) + 1 + strlen (PYTHON_PLUGIN_NAME) + 1; + str_home = malloc (len); + if (str_home) { - snprintf (p_home, len, "%s/python", weechat_home); - path = PyString_FromString (p_home); + snprintf (str_home, len, "%s/python", weechat_home); + path = PyBytes_FromString (str_home); if (path != NULL) { PyList_Insert (python_path, 0, path); Py_DECREF (path); } - free (p_home); + free (str_home); } } /* define some constants */ weechat_dict = PyModule_GetDict(weechat_module); - PyDict_SetItemString(weechat_dict, "WEECHAT_RC_OK", PyInt_FromLong((long) WEECHAT_RC_OK)); - PyDict_SetItemString(weechat_dict, "WEECHAT_RC_OK_EAT", PyInt_FromLong((long) WEECHAT_RC_OK_EAT)); - PyDict_SetItemString(weechat_dict, "WEECHAT_RC_ERROR", PyInt_FromLong((long) WEECHAT_RC_ERROR)); - - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_READ_OK", PyInt_FromLong((long) WEECHAT_CONFIG_READ_OK)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_READ_MEMORY_ERROR", PyInt_FromLong((long) WEECHAT_CONFIG_READ_MEMORY_ERROR)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_READ_FILE_NOT_FOUND", PyInt_FromLong((long) WEECHAT_CONFIG_READ_FILE_NOT_FOUND)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_WRITE_OK", PyInt_FromLong((long) WEECHAT_CONFIG_WRITE_OK)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_WRITE_ERROR", PyInt_FromLong((long) WEECHAT_CONFIG_WRITE_ERROR)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_WRITE_MEMORY_ERROR", PyInt_FromLong((long) WEECHAT_CONFIG_WRITE_MEMORY_ERROR)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_SET_OK_CHANGED", PyInt_FromLong((long) WEECHAT_CONFIG_OPTION_SET_OK_CHANGED)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE", PyInt_FromLong((long) WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_SET_ERROR", PyInt_FromLong((long) WEECHAT_CONFIG_OPTION_SET_ERROR)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_SET_OPTION_NOT_FOUND", PyInt_FromLong((long) WEECHAT_CONFIG_OPTION_SET_OPTION_NOT_FOUND)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_UNSET_OK_NO_RESET", PyInt_FromLong((long) WEECHAT_CONFIG_OPTION_UNSET_OK_NO_RESET)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_UNSET_OK_RESET", PyInt_FromLong((long) WEECHAT_CONFIG_OPTION_UNSET_OK_RESET)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED", PyInt_FromLong((long) WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED)); - PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_UNSET_ERROR", PyInt_FromLong((long) WEECHAT_CONFIG_OPTION_UNSET_ERROR)); - - PyDict_SetItemString(weechat_dict, "WEECHAT_LIST_POS_SORT", PyString_FromString(WEECHAT_LIST_POS_SORT)); - PyDict_SetItemString(weechat_dict, "WEECHAT_LIST_POS_BEGINNING", PyString_FromString(WEECHAT_LIST_POS_BEGINNING)); - PyDict_SetItemString(weechat_dict, "WEECHAT_LIST_POS_END", PyString_FromString(WEECHAT_LIST_POS_END)); - - PyDict_SetItemString(weechat_dict, "WEECHAT_HOTLIST_LOW", PyString_FromString(WEECHAT_HOTLIST_LOW)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOTLIST_MESSAGE", PyString_FromString(WEECHAT_HOTLIST_MESSAGE)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOTLIST_PRIVATE", PyString_FromString(WEECHAT_HOTLIST_PRIVATE)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOTLIST_HIGHLIGHT", PyString_FromString(WEECHAT_HOTLIST_HIGHLIGHT)); - - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_PROCESS_RUNNING", PyInt_FromLong((long) WEECHAT_HOOK_PROCESS_RUNNING)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_PROCESS_ERROR", PyInt_FromLong((long) WEECHAT_HOOK_PROCESS_ERROR)); - - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_OK", PyInt_FromLong((long) WEECHAT_HOOK_CONNECT_OK)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND", PyInt_FromLong((long) WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND", PyInt_FromLong((long) WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED", PyInt_FromLong((long) WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_PROXY_ERROR", PyInt_FromLong((long) WEECHAT_HOOK_CONNECT_PROXY_ERROR)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR", PyInt_FromLong((long) WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR", PyInt_FromLong((long) WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR", PyInt_FromLong((long) WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_MEMORY_ERROR", PyInt_FromLong((long) WEECHAT_HOOK_CONNECT_MEMORY_ERROR)); - - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_SIGNAL_STRING", PyString_FromString(WEECHAT_HOOK_SIGNAL_STRING)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_SIGNAL_INT", PyString_FromString(WEECHAT_HOOK_SIGNAL_INT)); - PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_SIGNAL_POINTER", PyString_FromString(WEECHAT_HOOK_SIGNAL_POINTER)); - + PyDict_SetItemString(weechat_dict, "WEECHAT_RC_OK", PyLong_FromLong((long) WEECHAT_RC_OK)); + PyDict_SetItemString(weechat_dict, "WEECHAT_RC_OK_EAT", PyLong_FromLong((long) WEECHAT_RC_OK_EAT)); + PyDict_SetItemString(weechat_dict, "WEECHAT_RC_ERROR", PyLong_FromLong((long) WEECHAT_RC_ERROR)); + + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_READ_OK", PyLong_FromLong((long) WEECHAT_CONFIG_READ_OK)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_READ_MEMORY_ERROR", PyLong_FromLong((long) WEECHAT_CONFIG_READ_MEMORY_ERROR)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_READ_FILE_NOT_FOUND", PyLong_FromLong((long) WEECHAT_CONFIG_READ_FILE_NOT_FOUND)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_WRITE_OK", PyLong_FromLong((long) WEECHAT_CONFIG_WRITE_OK)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_WRITE_ERROR", PyLong_FromLong((long) WEECHAT_CONFIG_WRITE_ERROR)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_WRITE_MEMORY_ERROR", PyLong_FromLong((long) WEECHAT_CONFIG_WRITE_MEMORY_ERROR)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_SET_OK_CHANGED", PyLong_FromLong((long) WEECHAT_CONFIG_OPTION_SET_OK_CHANGED)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE", PyLong_FromLong((long) WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_SET_ERROR", PyLong_FromLong((long) WEECHAT_CONFIG_OPTION_SET_ERROR)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_SET_OPTION_NOT_FOUND", PyLong_FromLong((long) WEECHAT_CONFIG_OPTION_SET_OPTION_NOT_FOUND)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_UNSET_OK_NO_RESET", PyLong_FromLong((long) WEECHAT_CONFIG_OPTION_UNSET_OK_NO_RESET)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_UNSET_OK_RESET", PyLong_FromLong((long) WEECHAT_CONFIG_OPTION_UNSET_OK_RESET)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED", PyLong_FromLong((long) WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED)); + PyDict_SetItemString(weechat_dict, "WEECHAT_CONFIG_OPTION_UNSET_ERROR", PyLong_FromLong((long) WEECHAT_CONFIG_OPTION_UNSET_ERROR)); + + PyDict_SetItemString(weechat_dict, "WEECHAT_LIST_POS_SORT", PyUnicode_FromString(WEECHAT_LIST_POS_SORT)); + PyDict_SetItemString(weechat_dict, "WEECHAT_LIST_POS_BEGINNING", PyUnicode_FromString(WEECHAT_LIST_POS_BEGINNING)); + PyDict_SetItemString(weechat_dict, "WEECHAT_LIST_POS_END", PyUnicode_FromString(WEECHAT_LIST_POS_END)); + + PyDict_SetItemString(weechat_dict, "WEECHAT_HOTLIST_LOW", PyUnicode_FromString(WEECHAT_HOTLIST_LOW)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOTLIST_MESSAGE", PyUnicode_FromString(WEECHAT_HOTLIST_MESSAGE)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOTLIST_PRIVATE", PyUnicode_FromString(WEECHAT_HOTLIST_PRIVATE)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOTLIST_HIGHLIGHT", PyUnicode_FromString(WEECHAT_HOTLIST_HIGHLIGHT)); + + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_PROCESS_RUNNING", PyLong_FromLong((long) WEECHAT_HOOK_PROCESS_RUNNING)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_PROCESS_ERROR", PyLong_FromLong((long) WEECHAT_HOOK_PROCESS_ERROR)); + + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_OK", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_OK)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_PROXY_ERROR", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_PROXY_ERROR)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_CONNECT_MEMORY_ERROR", PyLong_FromLong((long) WEECHAT_HOOK_CONNECT_MEMORY_ERROR)); + + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_SIGNAL_STRING", PyUnicode_FromString(WEECHAT_HOOK_SIGNAL_STRING)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_SIGNAL_INT", PyUnicode_FromString(WEECHAT_HOOK_SIGNAL_INT)); + PyDict_SetItemString(weechat_dict, "WEECHAT_HOOK_SIGNAL_POINTER", PyUnicode_FromString(WEECHAT_HOOK_SIGNAL_POINTER)); + +#if PY_MAJOR_VERSION >= 3 + /* python 3.x (or newer) */ + weechat_outputs = PyModule_Create (&moduleDefOutputs); +#else + /* python 2.x */ weechat_outputs = Py_InitModule("weechatOutputs", weechat_python_output_funcs); - if (weechat_outputs == NULL) +#endif + + if (!weechat_outputs) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to redirect stdout and " @@ -1044,12 +1149,12 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) return WEECHAT_RC_ERROR; } - PyEval_InitThreads(); + //PyEval_InitThreads(); /* python_mainThreadState = PyThreadState_Swap(NULL); */ python_mainThreadState = PyEval_SaveThread(); /* PyEval_ReleaseLock (); */ - if (python_mainThreadState == NULL) + if (!python_mainThreadState) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to get current "