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); }
int weechat_perl_eval (struct t_gui_buffer *buffer, int send_to_buffer_as_input, int exec_commands, const char *code) { void *func_argv[1], *result; if (!perl_script_eval) { perl_quiet = 1; perl_script_eval = weechat_perl_load (WEECHAT_SCRIPT_EVAL_NAME, PERL_EVAL_SCRIPT); perl_quiet = 0; if (!perl_script_eval) return 0; } weechat_perl_output_flush (); perl_eval_mode = 1; perl_eval_send_input = send_to_buffer_as_input; perl_eval_exec_commands = exec_commands; perl_eval_buffer = buffer; func_argv[0] = (char *)code; result = weechat_perl_exec (perl_script_eval, WEECHAT_SCRIPT_EXEC_IGNORE, "script_perl_eval", "s", func_argv); /* result is ignored */ if (result) free (result); weechat_perl_output_flush (); perl_eval_mode = 0; perl_eval_send_input = 0; perl_eval_exec_commands = 0; perl_eval_buffer = NULL; if (!weechat_config_boolean (perl_config_look_eval_keep_context)) { perl_quiet = 1; weechat_perl_unload (perl_script_eval); perl_quiet = 0; perl_script_eval = NULL; } return 1; }