void weechat_perl_unload (struct t_plugin_script *script) { int *rc; void *interpreter; char *filename; if ((weechat_perl_plugin->debug >= 2) || !perl_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), PERL_PLUGIN_NAME, script->name); } #ifdef MULTIPLICITY PERL_SET_CONTEXT (script->interpreter); #endif /* MULTIPLICITY */ if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_perl_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (perl_current_script == script) { perl_current_script = (perl_current_script->prev_script) ? perl_current_script->prev_script : perl_current_script->next_script; } plugin_script_remove (weechat_perl_plugin, &perl_scripts, &last_perl_script, script); #ifdef MULTIPLICITY if (interpreter) { perl_destruct (interpreter); perl_free (interpreter); } if (perl_current_script) { PERL_SET_CONTEXT (perl_current_script->interpreter); } #else if (interpreter) free (interpreter); #endif /* MULTIPLICITY */ (void) weechat_hook_signal_send ("perl_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void weechat_python_unload (struct t_plugin_script *script) { int *rc; void *interpreter; char *filename; if ((weechat_python_plugin->debug >= 2) || !python_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), PYTHON_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *) weechat_python_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (python_current_script == script) { python_current_script = (python_current_script->prev_script) ? python_current_script->prev_script : python_current_script->next_script; } plugin_script_remove (weechat_python_plugin, &python_scripts, &last_python_script, script); if (interpreter) { PyThreadState_Swap (interpreter); Py_EndInterpreter (interpreter); } if (python_current_script) PyThreadState_Swap (python_current_script->interpreter); (void) weechat_hook_signal_send ("python_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void weechat_lua_unload (struct t_plugin_script *script) { int *rc; void *interpreter; char *filename; if ((weechat_lua_plugin->debug >= 2) || !lua_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), LUA_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_lua_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (lua_current_script == script) lua_current_script = (lua_current_script->prev_script) ? lua_current_script->prev_script : lua_current_script->next_script; plugin_script_remove (weechat_lua_plugin, &lua_scripts, &last_lua_script, script); if (interpreter) lua_close (interpreter); if (lua_current_script) lua_current_interpreter = lua_current_script->interpreter; (void) weechat_hook_signal_send ("lua_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void weechat_guile_unload (struct t_plugin_script *script) { int *rc; void *interpreter; char *filename; if ((weechat_guile_plugin->debug >= 2) || !guile_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), GUILE_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_guile_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (guile_current_script == script) guile_current_script = (guile_current_script->prev_script) ? guile_current_script->prev_script : guile_current_script->next_script; plugin_script_remove (weechat_guile_plugin, &guile_scripts, &last_guile_script, script); if (interpreter) weechat_guile_catch (scm_gc_unprotect_object, interpreter); if (guile_current_script) scm_set_current_module ((SCM)(guile_current_script->interpreter)); (void) weechat_hook_signal_send ("guile_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void weechat_js_unload (struct t_plugin_script *script) { int *rc; char *filename; void *interpreter; if ((weechat_js_plugin->debug >= 2) || !js_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), JS_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_js_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (js_current_script == script) { js_current_script = (js_current_script->prev_script) ? js_current_script->prev_script : js_current_script->next_script; } plugin_script_remove (weechat_js_plugin, &js_scripts, &last_js_script, script); if (interpreter) delete((WeechatJsV8 *)interpreter); (void) weechat_hook_signal_send ("javascript_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void weechat_ruby_unload (struct t_plugin_script *script) { int *rc; void *interpreter; char *filename; if ((weechat_ruby_plugin->debug >= 2) || !ruby_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), RUBY_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_ruby_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, 0, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (ruby_current_script == script) ruby_current_script = (ruby_current_script->prev_script) ? ruby_current_script->prev_script : ruby_current_script->next_script; plugin_script_remove (weechat_ruby_plugin, &ruby_scripts, &last_ruby_script, script); if (interpreter) rb_gc_unregister_address (interpreter); (void) weechat_hook_signal_send ("ruby_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void weechat_tcl_unload (struct t_plugin_script *script) { Tcl_Interp* interp; int *rc; char *filename; if ((weechat_tcl_plugin->debug >= 2) || !tcl_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), TCL_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_tcl_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interp = (Tcl_Interp*)script->interpreter; if (tcl_current_script == script) tcl_current_script = (tcl_current_script->prev_script) ? tcl_current_script->prev_script : tcl_current_script->next_script; plugin_script_remove (weechat_tcl_plugin, &tcl_scripts, &last_tcl_script, script); Tcl_DeleteInterp(interp); weechat_hook_signal_send ("tcl_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void weechat_guile_module_init_script (void *data) { SCM rc; weechat_guile_catch (scm_c_eval_string, "(use-modules (weechat))"); rc = weechat_guile_catch (scm_c_primitive_load, data); /* error loading script? */ if (rc == SCM_BOOL_F) { /* if script was registered, remove it from list */ if (guile_current_script) { plugin_script_remove (weechat_guile_plugin, &guile_scripts, &last_guile_script, guile_current_script); } guile_current_script = NULL; guile_registered_script = NULL; } }
int weechat_lua_load (const char *filename) { FILE *fp; char *weechat_lua_code = { "weechat_outputs = {\n" " write = function (self, str)\n" " weechat.print(\"\", \"lua: stdout/stderr: \" .. str)\n" " end\n" "}\n" "io.stdout = weechat_outputs\n" "io.stderr = weechat_outputs\n" }; if ((fp = fopen (filename, "r")) == NULL) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), LUA_PLUGIN_NAME, filename); return 0; } if ((weechat_lua_plugin->debug >= 2) || !lua_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), LUA_PLUGIN_NAME, filename); } lua_current_script = NULL; lua_registered_script = NULL; lua_current_interpreter = luaL_newstate(); if (lua_current_interpreter == NULL) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " "sub-interpreter"), weechat_prefix ("error"), LUA_PLUGIN_NAME); fclose (fp); return 0; } #ifdef LUA_VERSION_NUM /* LUA_VERSION_NUM is defined only in lua >= 5.1.0 */ luaL_openlibs (lua_current_interpreter); #else luaopen_base (lua_current_interpreter); luaopen_string (lua_current_interpreter); luaopen_table (lua_current_interpreter); luaopen_math (lua_current_interpreter); luaopen_io (lua_current_interpreter); luaopen_debug (lua_current_interpreter); #endif weechat_lua_register_lib (lua_current_interpreter, "weechat", weechat_lua_api_funcs); #ifdef LUA_VERSION_NUM if (luaL_dostring (lua_current_interpreter, weechat_lua_code) != 0) #else if (lua_dostring (lua_current_interpreter, weechat_lua_code) != 0) #endif { weechat_printf (NULL, weechat_gettext ("%s%s: unable to redirect stdout " "and stderr"), weechat_prefix ("error"), LUA_PLUGIN_NAME); } lua_current_script_filename = filename; if (luaL_loadfile (lua_current_interpreter, filename) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to load file \"%s\""), weechat_prefix ("error"), LUA_PLUGIN_NAME, filename); weechat_printf (NULL, weechat_gettext ("%s%s: error: %s"), weechat_prefix ("error"), LUA_PLUGIN_NAME, lua_tostring (lua_current_interpreter, -1)); lua_close (lua_current_interpreter); fclose (fp); return 0; } if (lua_pcall (lua_current_interpreter, 0, 0, 0) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to execute file " "\"%s\""), weechat_prefix ("error"), LUA_PLUGIN_NAME, filename); weechat_printf (NULL, weechat_gettext ("%s%s: error: %s"), weechat_prefix ("error"), LUA_PLUGIN_NAME, lua_tostring (lua_current_interpreter, -1)); lua_close (lua_current_interpreter); fclose (fp); /* if script was registered, remove it from list */ if (lua_current_script) { plugin_script_remove (weechat_lua_plugin, &lua_scripts, &last_lua_script, lua_current_script); } return 0; } fclose (fp); if (!lua_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), LUA_PLUGIN_NAME, filename); lua_close (lua_current_interpreter); return 0; } lua_current_script = lua_registered_script; lua_current_script->interpreter = (lua_State *) lua_current_interpreter; /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_lua_plugin, lua_scripts, lua_current_script, &weechat_lua_api_buffer_input_data_cb, &weechat_lua_api_buffer_close_cb); weechat_hook_signal_send ("lua_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, lua_current_script->filename); return 1; }
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; PyObject *weechat_outputs, *python_path, *path; const char *weechat_home; char *str_home; int len; if ((fp = fopen (filename, "r")) == NULL) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), PYTHON_PLUGIN_NAME, filename); return 0; } if ((weechat_python_plugin->debug >= 2) || !python_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), PYTHON_PLUGIN_NAME, filename); } python_current_script = NULL; python_registered_script = NULL; /* PyEval_AcquireLock (); */ python_current_interpreter = Py_NewInterpreter (); #if PY_MAJOR_VERSION >= 3 /* python >= 3.x */ len = mbstowcs (NULL, argv[0], 0) + 1; 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) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " "sub-interpreter"), weechat_prefix ("error"), PYTHON_PLUGIN_NAME); fclose (fp); /* PyEval_ReleaseLock (); */ return 0; } PyThreadState_Swap (python_current_interpreter); /* adding $weechat_dir/python in $PYTHONPATH */ python_path = PySys_GetObject ("path"); weechat_home = weechat_info_get ("weechat_dir", ""); if (weechat_home) { len = strlen (weechat_home) + 1 + strlen (PYTHON_PLUGIN_NAME) + 1; str_home = malloc (len); if (str_home) { snprintf (str_home, len, "%s/python", weechat_home); #if PY_MAJOR_VERSION >= 3 /* python >= 3.x */ path = PyUnicode_FromString(str_home); #else /* python <= 2.x */ path = PyBytes_FromString (str_home); #endif if (path != NULL) { PyList_Insert (python_path, 0, path); Py_DECREF (path); } free (str_home); } } #if PY_MAJOR_VERSION >= 3 /* python >= 3.x */ weechat_outputs = PyModule_Create (&moduleDefOutputs); #else /* python <= 2.x */ weechat_outputs = Py_InitModule("weechatOutputs", weechat_python_output_funcs); #endif if (!weechat_outputs) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to redirect stdout and " "stderr"), weechat_prefix ("error"), PYTHON_PLUGIN_NAME); } else { if (PySys_SetObject("stdout", weechat_outputs) == -1) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to redirect stdout"), weechat_prefix ("error"), PYTHON_PLUGIN_NAME); } if (PySys_SetObject("stderr", weechat_outputs) == -1) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to redirect stderr"), weechat_prefix ("error"), PYTHON_PLUGIN_NAME); } } python_current_script_filename = filename; if (PyRun_SimpleFile (fp, filename) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to parse file \"%s\""), weechat_prefix ("error"), PYTHON_PLUGIN_NAME, filename); fclose (fp); if (PyErr_Occurred ()) PyErr_Print (); /* if script was registered, remove it from list */ if (python_current_script != NULL) { plugin_script_remove (weechat_python_plugin, &python_scripts, &last_python_script, python_current_script); } Py_EndInterpreter (python_current_interpreter); /* PyEval_ReleaseLock (); */ return 0; } if (PyErr_Occurred ()) PyErr_Print (); fclose (fp); if (!python_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), PYTHON_PLUGIN_NAME, filename); if (PyErr_Occurred ()) PyErr_Print (); Py_EndInterpreter (python_current_interpreter); /* PyEval_ReleaseLock (); */ return 0; } python_current_script = python_registered_script; /* PyEval_ReleaseThread (python_current_script->interpreter); */ /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_python_plugin, python_scripts, python_current_script, &weechat_python_api_buffer_input_data_cb, &weechat_python_api_buffer_close_cb); (void) weechat_hook_signal_send ("python_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, python_current_script->filename); return 1; }
int weechat_perl_load (const char *filename) { struct t_plugin_script temp_script; struct stat buf; char *perl_code; int length; #ifndef MULTIPLICITY char pkgname[64]; #endif /* MULTIPLICITY */ temp_script.filename = NULL; temp_script.interpreter = NULL; temp_script.name = NULL; temp_script.author = NULL; temp_script.version = NULL; temp_script.license = NULL; temp_script.description = NULL; temp_script.shutdown_func = NULL; temp_script.charset = NULL; if (stat (filename, &buf) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), PERL_PLUGIN_NAME, filename); return 0; } if ((weechat_perl_plugin->debug >= 2) || !perl_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), PERL_PLUGIN_NAME, filename); } perl_current_script = NULL; perl_current_script_filename = filename; perl_registered_script = NULL; #ifdef MULTIPLICITY perl_current_interpreter = perl_alloc(); if (!perl_current_interpreter) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " "sub-interpreter"), weechat_prefix ("error"), PERL_PLUGIN_NAME); return 0; } PERL_SET_CONTEXT (perl_current_interpreter); perl_construct (perl_current_interpreter); temp_script.interpreter = (PerlInterpreter *) perl_current_interpreter; perl_parse (perl_current_interpreter, weechat_perl_api_init, perl_args_count, perl_args, NULL); length = strlen (perl_weechat_code) - 2 + strlen (filename) + 1; perl_code = malloc (length); if (!perl_code) return 0; snprintf (perl_code, length, perl_weechat_code, filename); #else snprintf (pkgname, sizeof (pkgname), "%s%d", PKG_NAME_PREFIX, perl_num); perl_num++; length = strlen (perl_weechat_code) - 4 + strlen (pkgname) + strlen (filename) + 1; perl_code = malloc (length); if (!perl_code) return 0; snprintf (perl_code, length, perl_weechat_code, pkgname, filename); #endif /* MULTIPLICITY */ eval_pv (perl_code, TRUE); free (perl_code); if (SvTRUE (ERRSV)) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to parse file " "\"%s\""), weechat_prefix ("error"), PERL_PLUGIN_NAME, filename); weechat_printf (NULL, weechat_gettext ("%s%s: error: %s"), weechat_prefix ("error"), PERL_PLUGIN_NAME, SvPV_nolen(ERRSV)); #ifdef MULTIPLICITY perl_destruct (perl_current_interpreter); perl_free (perl_current_interpreter); #endif /* MULTIPLICITY */ if (perl_current_script && (perl_current_script != &temp_script)) { plugin_script_remove (weechat_perl_plugin, &perl_scripts, &last_perl_script, perl_current_script); perl_current_script = NULL; } return 0; } if (!perl_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), PERL_PLUGIN_NAME, filename); #ifdef MULTIPLICITY perl_destruct (perl_current_interpreter); perl_free (perl_current_interpreter); #endif /* MULTIPLICITY */ return 0; } perl_current_script = perl_registered_script; #ifndef MULTIPLICITY perl_current_script->interpreter = strdup (pkgname); #endif /* MULTIPLICITY */ /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_perl_plugin, perl_scripts, perl_current_script, &weechat_perl_api_buffer_input_data_cb, &weechat_perl_api_buffer_close_cb); (void) weechat_hook_signal_send ("perl_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, perl_current_script->filename); return 1; }
struct t_plugin_script * weechat_js_load (const char *filename, const char *code) { char *source; /* make C compiler happy */ /* TODO: implement load of code in Javascript */ (void) code; source = weechat_file_get_content (filename); if (!source) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), JS_PLUGIN_NAME, filename); return NULL; } if ((weechat_js_plugin->debug >= 2) || !js_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), JS_PLUGIN_NAME, filename); } js_current_script = NULL; js_registered_script = NULL; js_current_interpreter = new WeechatJsV8(); if (!js_current_interpreter) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " "sub-interpreter"), weechat_prefix ("error"), JS_PLUGIN_NAME); free (source); return NULL; } /* load libs */ js_current_interpreter->loadLibs(); js_current_script_filename = filename; if (!js_current_interpreter->load(source)) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to load file \"%s\""), weechat_prefix ("error"), JS_PLUGIN_NAME); delete js_current_interpreter; free (source); /* if script was registered, remove it from list */ if (js_current_script) { plugin_script_remove (weechat_js_plugin, &js_scripts, &last_js_script, js_current_script); js_current_script = NULL; } return NULL; } free (source); if (!js_current_interpreter->execScript()) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to execute file " "\"%s\""), weechat_prefix ("error"), JS_PLUGIN_NAME, filename); delete js_current_interpreter; /* if script was registered, remove it from list */ if (js_current_script) { plugin_script_remove (weechat_js_plugin, &js_scripts, &last_js_script, js_current_script); js_current_script = NULL; } return NULL; } if (!js_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), JS_PLUGIN_NAME, filename); delete js_current_interpreter; return NULL; } js_current_script = js_registered_script; /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_js_plugin, js_scripts, js_current_script, &weechat_js_api_buffer_input_data_cb, &weechat_js_api_buffer_close_cb); weechat_hook_signal_send ("javascript_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, js_current_script->filename); return js_current_script; }
int weechat_ruby_load (const char *filename) { char modname[64]; VALUE ruby_retcode, err, argv[1]; int ruby_error; struct stat buf; if (stat (filename, &buf) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); return 0; } if ((weechat_ruby_plugin->debug >= 2) || !ruby_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), RUBY_PLUGIN_NAME, filename); } ruby_current_script = NULL; ruby_registered_script = NULL; snprintf (modname, sizeof(modname), "%s%d", MOD_NAME_PREFIX, ruby_num); ruby_num++; ruby_current_module = rb_define_module (modname); ruby_current_script_filename = filename; argv[0] = rb_str_new2 (filename); ruby_retcode = rb_protect_funcall (ruby_current_module, rb_intern ("load_eval_file"), &ruby_error, 1, argv); if (ruby_retcode == Qnil) { err = rb_gv_get("$!"); weechat_ruby_print_exception(err); return 0; } if (NUM2INT(ruby_retcode) != 0) { switch (NUM2INT(ruby_retcode)) { case 1: weechat_printf (NULL, weechat_gettext ("%s%s: unable to read file " "\"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; case 2: weechat_printf (NULL, weechat_gettext ("%s%s: error while loading " "file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; case 3: weechat_printf (NULL, weechat_gettext ("%s%s: function " "\"weechat_init\" is missing " "in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; } if (NUM2INT(ruby_retcode) == 2) { weechat_ruby_print_exception (rb_iv_get (ruby_current_module, "@load_eval_file_error")); } return 0; } (void) rb_protect_funcall (ruby_current_module, rb_intern ("weechat_init"), &ruby_error, 0, NULL); if (ruby_error) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to eval function " "\"weechat_init\" in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); err = rb_gv_get("$!"); weechat_ruby_print_exception(err); if (ruby_current_script != NULL) { plugin_script_remove (weechat_ruby_plugin, &ruby_scripts, &last_ruby_script, ruby_current_script); } return 0; } if (!ruby_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); return 0; } ruby_current_script = ruby_registered_script; rb_gc_register_address (ruby_current_script->interpreter); /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_ruby_plugin, ruby_scripts, ruby_current_script, &weechat_ruby_api_buffer_input_data_cb, &weechat_ruby_api_buffer_close_cb); (void) weechat_hook_signal_send ("ruby_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, ruby_current_script->filename); return 1; }
struct t_plugin_script * weechat_tcl_load (const char *filename, const char *code) { int i; Tcl_Interp *interp; struct stat buf; /* make C compiler happy */ /* TODO: implement load of code in TCL */ (void) code; if (stat (filename, &buf) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), TCL_PLUGIN_NAME, filename); return NULL; } if ((weechat_tcl_plugin->debug >= 2) || !tcl_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), TCL_PLUGIN_NAME, filename); } tcl_current_script = NULL; tcl_registered_script = NULL; if (!(interp = Tcl_CreateInterp ())) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " "interpreter"), weechat_prefix ("error"), TCL_PLUGIN_NAME); return NULL; } tcl_current_script_filename = filename; weechat_tcl_api_init (interp); if (Tcl_EvalFile (interp, filename) != TCL_OK) { weechat_printf (NULL, weechat_gettext ("%s%s: error occurred while " "parsing file \"%s\": %s"), weechat_prefix ("error"), TCL_PLUGIN_NAME, filename, Tcl_GetStringFromObj (Tcl_GetObjResult (interp), &i)); /* if script was registered, remove it from list */ if (tcl_current_script) { plugin_script_remove (weechat_tcl_plugin, &tcl_scripts, &last_tcl_script, tcl_current_script); tcl_current_script = NULL; } return NULL; } if (!tcl_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), TCL_PLUGIN_NAME, filename); Tcl_DeleteInterp (interp); return NULL; } tcl_current_script = tcl_registered_script; /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_tcl_plugin, tcl_scripts, tcl_current_script, &weechat_tcl_api_buffer_input_data_cb, &weechat_tcl_api_buffer_close_cb); (void) weechat_hook_signal_send ("tcl_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, tcl_current_script->filename); return tcl_current_script; }