diff options
Diffstat (limited to 'plugins/perl/perl.c')
-rw-r--r-- | plugins/perl/perl.c | 258 |
1 files changed, 171 insertions, 87 deletions
diff --git a/plugins/perl/perl.c b/plugins/perl/perl.c index af7865d7..79baff5a 100644 --- a/plugins/perl/perl.c +++ b/plugins/perl/perl.c @@ -323,11 +323,11 @@ array2av (char *array[]) return av; } -/* sets $Xchat::Embed::current_package */ +/* sets $HexChat::Embed::current_package */ static void set_current_package (SV *package) { - SV *current_package = get_sv ("Xchat::Embed::current_package", 1); + SV *current_package = get_sv ("HexChat::Embed::current_package", 1); SvSetSV_nosteal (current_package, package); } @@ -367,7 +367,7 @@ fd_cb (int fd, int flags, void *userdata) XPUSHs (sv_2mortal (newSViv (PTR2IV (data->hook)))); PUTBACK; - call_pv ("Xchat::unhook", G_EVAL); + call_pv ("HexChat::unhook", G_EVAL); SPAGAIN; SvREFCNT_dec (data->callback); @@ -429,7 +429,7 @@ timer_cb (void *userdata) XPUSHs (sv_mortalcopy (data->package)); PUTBACK; - call_pv ("Xchat::unhook", G_EVAL); + call_pv ("HexChat::unhook", G_EVAL); SPAGAIN; } } @@ -619,19 +619,19 @@ print_cb (char *word[], void *userdata) /* custom IRC perl functions for scripting */ -/* Xchat::Internal::register (scriptname, version, desc, shutdowncallback, filename) +/* HexChat::Internal::register (scriptname, version, desc, shutdowncallback, filename) * */ static -XS (XS_Xchat_register) +XS (XS_HexChat_register) { char *name, *version, *desc, *filename; void *gui_entry; dXSARGS; if (items != 4) { hexchat_printf (ph, - "Usage: Xchat::Internal::register(scriptname, version, desc, filename)"); + "Usage: HexChat::Internal::register(scriptname, version, desc, filename)"); } else { name = SvPV_nolen (ST (0)); version = SvPV_nolen (ST (1)); @@ -647,16 +647,16 @@ XS (XS_Xchat_register) } -/* Xchat::print(output) */ +/* HexChat::print(output) */ static -XS (XS_Xchat_print) +XS (XS_HexChat_print) { char *text = NULL; dXSARGS; if (items != 1) { - hexchat_print (ph, "Usage: Xchat::Internal::print(text)"); + hexchat_print (ph, "Usage: HexChat::Internal::print(text)"); } else { text = SvPV_nolen (ST (0)); hexchat_print (ph, text); @@ -665,7 +665,7 @@ XS (XS_Xchat_print) } static -XS (XS_Xchat_emit_print) +XS (XS_HexChat_emit_print) { char *event_name; int RETVAL; @@ -673,7 +673,7 @@ XS (XS_Xchat_emit_print) dXSARGS; if (items < 1) { - hexchat_print (ph, "Usage: Xchat::emit_print(event_name, ...)"); + hexchat_print (ph, "Usage: HexChat::emit_print(event_name, ...)"); } else { event_name = (char *) SvPV_nolen (ST (0)); RETVAL = 0; @@ -719,7 +719,7 @@ XS (XS_Xchat_emit_print) } static -XS (XS_Xchat_send_modes) +XS (XS_HexChat_send_modes) { AV *p_targets = NULL; int modes_per_line = 0; @@ -733,7 +733,7 @@ XS (XS_Xchat_send_modes) dXSARGS; if (items < 3 || items > 4) { hexchat_print (ph, - "Usage: Xchat::send_modes( targets, sign, mode, modes_per_line)" + "Usage: HexChat::send_modes( targets, sign, mode, modes_per_line)" ); } else { if (SvROK (ST (0))) { @@ -771,12 +771,12 @@ XS (XS_Xchat_send_modes) } } static -XS (XS_Xchat_get_info) +XS (XS_HexChat_get_info) { SV *temp = NULL; dXSARGS; if (items != 1) { - hexchat_print (ph, "Usage: Xchat::get_info(id)"); + hexchat_print (ph, "Usage: HexChat::get_info(id)"); } else { SV *id = ST (0); const char *RETVAL; @@ -810,13 +810,13 @@ XS (XS_Xchat_get_info) } static -XS (XS_Xchat_context_info) +XS (XS_HexChat_context_info) { const char *const *fields; dXSARGS; if (items > 0 ) { - hexchat_print (ph, "Usage: Xchat::Internal::context_info()"); + hexchat_print (ph, "Usage: HexChat::Internal::context_info()"); } fields = hexchat_list_fields (ph, "channels" ); XPUSHs (list_item_to_sv (NULL, fields)); @@ -824,14 +824,14 @@ XS (XS_Xchat_context_info) } static -XS (XS_Xchat_get_prefs) +XS (XS_HexChat_get_prefs) { const char *str; int integer; SV *temp = NULL; dXSARGS; if (items != 1) { - hexchat_print (ph, "Usage: Xchat::get_prefs(name)"); + hexchat_print (ph, "Usage: HexChat::get_prefs(name)"); } else { @@ -860,9 +860,9 @@ XS (XS_Xchat_get_prefs) } } -/* Xchat::Internal::hook_server(name, priority, callback, userdata) */ +/* HexChat::Internal::hook_server(name, priority, callback, userdata) */ static -XS (XS_Xchat_hook_server) +XS (XS_HexChat_hook_server) { char *name; @@ -877,7 +877,7 @@ XS (XS_Xchat_hook_server) if (items != 5) { hexchat_print (ph, - "Usage: Xchat::Internal::hook_server(name, priority, callback, userdata, package)"); + "Usage: HexChat::Internal::hook_server(name, priority, callback, userdata, package)"); } else { name = SvPV_nolen (ST (0)); pri = (int) SvIV (ST (1)); @@ -901,9 +901,9 @@ XS (XS_Xchat_hook_server) } } -/* Xchat::Internal::hook_command(name, priority, callback, help_text, userdata) */ +/* HexChat::Internal::hook_command(name, priority, callback, help_text, userdata) */ static -XS (XS_Xchat_hook_command) +XS (XS_HexChat_hook_command) { char *name; int pri; @@ -918,7 +918,7 @@ XS (XS_Xchat_hook_command) if (items != 6) { hexchat_print (ph, - "Usage: Xchat::Internal::hook_command(name, priority, callback, help_text, userdata, package)"); + "Usage: HexChat::Internal::hook_command(name, priority, callback, help_text, userdata, package)"); } else { name = SvPV_nolen (ST (0)); pri = (int) SvIV (ST (1)); @@ -950,9 +950,9 @@ XS (XS_Xchat_hook_command) } -/* Xchat::Internal::hook_print(name, priority, callback, [userdata]) */ +/* HexChat::Internal::hook_print(name, priority, callback, [userdata]) */ static -XS (XS_Xchat_hook_print) +XS (XS_HexChat_hook_print) { char *name; @@ -965,7 +965,7 @@ XS (XS_Xchat_hook_print) dXSARGS; if (items != 5) { hexchat_print (ph, - "Usage: Xchat::Internal::hook_print(name, priority, callback, userdata, package)"); + "Usage: HexChat::Internal::hook_print(name, priority, callback, userdata, package)"); } else { name = SvPV_nolen (ST (0)); pri = (int) SvIV (ST (1)); @@ -989,9 +989,9 @@ XS (XS_Xchat_hook_print) } } -/* Xchat::Internal::hook_timer(timeout, callback, userdata) */ +/* HexChat::Internal::hook_timer(timeout, callback, userdata) */ static -XS (XS_Xchat_hook_timer) +XS (XS_HexChat_hook_timer) { int timeout; SV *callback; @@ -1004,7 +1004,7 @@ XS (XS_Xchat_hook_timer) if (items != 4) { hexchat_print (ph, - "Usage: Xchat::Internal::hook_timer(timeout, callback, userdata, package)"); + "Usage: HexChat::Internal::hook_timer(timeout, callback, userdata, package)"); } else { timeout = (int) SvIV (ST (0)); callback = ST (1); @@ -1028,9 +1028,9 @@ XS (XS_Xchat_hook_timer) } } -/* Xchat::Internal::hook_fd(fd, callback, flags, userdata) */ +/* HexChat::Internal::hook_fd(fd, callback, flags, userdata) */ static -XS (XS_Xchat_hook_fd) +XS (XS_HexChat_hook_fd) { int fd; SV *callback; @@ -1044,7 +1044,7 @@ XS (XS_Xchat_hook_fd) if (items != 5) { hexchat_print (ph, - "Usage: Xchat::Internal::hook_fd(fd, callback, flags, userdata)"); + "Usage: HexChat::Internal::hook_fd(fd, callback, flags, userdata)"); } else { fd = (int) SvIV (ST (0)); callback = ST (1); @@ -1083,14 +1083,14 @@ XS (XS_Xchat_hook_fd) } static -XS (XS_Xchat_unhook) +XS (XS_HexChat_unhook) { hexchat_hook *hook; HookData *userdata; int retCount = 0; dXSARGS; if (items != 1) { - hexchat_print (ph, "Usage: Xchat::unhook(hook)"); + hexchat_print (ph, "Usage: HexChat::unhook(hook)"); } else { hook = INT2PTR (hexchat_hook *, SvUV (ST (0))); userdata = (HookData *) hexchat_unhook (ph, hook); @@ -1117,15 +1117,15 @@ XS (XS_Xchat_unhook) XSRETURN_EMPTY; } -/* Xchat::Internal::command(command) */ +/* HexChat::Internal::command(command) */ static -XS (XS_Xchat_command) +XS (XS_HexChat_command) { char *cmd = NULL; dXSARGS; if (items != 1) { - hexchat_print (ph, "Usage: Xchat::Internal::command(command)"); + hexchat_print (ph, "Usage: HexChat::Internal::command(command)"); } else { cmd = SvPV_nolen (ST (0)); hexchat_command (ph, cmd); @@ -1135,7 +1135,7 @@ XS (XS_Xchat_command) } static -XS (XS_Xchat_find_context) +XS (XS_HexChat_find_context) { char *server = NULL; char *chan = NULL; @@ -1143,7 +1143,7 @@ XS (XS_Xchat_find_context) dXSARGS; if (items > 2) - hexchat_print (ph, "Usage: Xchat::find_context ([channel, [server]])"); + hexchat_print (ph, "Usage: HexChat::find_context ([channel, [server]])"); { switch (items) { @@ -1191,23 +1191,23 @@ XS (XS_Xchat_find_context) } static -XS (XS_Xchat_get_context) +XS (XS_HexChat_get_context) { dXSARGS; if (items != 0) { - hexchat_print (ph, "Usage: Xchat::get_context()"); + hexchat_print (ph, "Usage: HexChat::get_context()"); } else { XSRETURN_IV (PTR2IV (hexchat_get_context (ph))); } } static -XS (XS_Xchat_set_context) +XS (XS_HexChat_set_context) { hexchat_context *ctx; dXSARGS; if (items != 1) { - hexchat_print (ph, "Usage: Xchat::set_context(ctx)"); + hexchat_print (ph, "Usage: HexChat::set_context(ctx)"); } else { ctx = INT2PTR (hexchat_context *, SvUV (ST (0))); XSRETURN_IV ((IV) hexchat_set_context (ph, ctx)); @@ -1215,11 +1215,11 @@ XS (XS_Xchat_set_context) } static -XS (XS_Xchat_nickcmp) +XS (XS_HexChat_nickcmp) { dXSARGS; if (items != 2) { - hexchat_print (ph, "Usage: Xchat::nickcmp(s1, s2)"); + hexchat_print (ph, "Usage: HexChat::nickcmp(s1, s2)"); } else { XSRETURN_IV ((IV) hexchat_nickcmp (ph, SvPV_nolen (ST (0)), SvPV_nolen (ST (1)))); @@ -1227,7 +1227,7 @@ XS (XS_Xchat_nickcmp) } static -XS (XS_Xchat_get_list) +XS (XS_HexChat_get_list) { SV *name; hexchat_list *list; @@ -1236,7 +1236,7 @@ XS (XS_Xchat_get_list) dXSARGS; if (items != 1) { - hexchat_print (ph, "Usage: Xchat::get_list(name)"); + hexchat_print (ph, "Usage: HexChat::get_list(name)"); } else { SP -= items; /*remove the argument list from the stack */ @@ -1268,12 +1268,12 @@ XS (XS_Xchat_get_list) } static -XS (XS_Xchat_Embed_plugingui_remove) +XS (XS_HexChat_Embed_plugingui_remove) { void *gui_entry; dXSARGS; if (items != 1) { - hexchat_print (ph, "Usage: Xchat::Embed::plugingui_remove(handle)"); + hexchat_print (ph, "Usage: HexChat::Embed::plugingui_remove(handle)"); } else { gui_entry = INT2PTR (void *, SvUV (ST (0))); hexchat_plugingui_remove (ph, gui_entry); @@ -1281,6 +1281,72 @@ XS (XS_Xchat_Embed_plugingui_remove) XSRETURN_EMPTY; } +static +XS (XS_HexChat_plugin_pref_set) +{ + dMARK; + dAX; + + XSRETURN_IV ((IV) hexchat_pluginpref_set_str (ph, SvPV_nolen (ST (0)), + SvPV_nolen (ST (1)))); +} + +static +XS (XS_HexChat_plugin_pref_get) +{ + int result; + char value[512]; + + dMARK; + dAX; + + result = hexchat_pluginpref_get_str (ph, SvPV_nolen (ST (0)), value); + + if (result) + XSRETURN_PV (value); + + XSRETURN_UNDEF; +} + +static +XS (XS_HexChat_plugin_pref_delete) +{ + dMARK; + dAX; + + XSRETURN_IV ((IV) hexchat_pluginpref_delete (ph, SvPV_nolen (ST (0)))); +} + +static +XS (XS_HexChat_plugin_pref_list) +{ + char list[4096]; + char value[512]; + char *token; + + dSP; + dMARK; + dAX; + + if (!hexchat_pluginpref_list (ph, list)) + XSRETURN_EMPTY; + + PUSHMARK (SP); + + token = strtok (list, ","); + while (token != NULL) + { + hexchat_pluginpref_get_str (ph, token, value); + + XPUSHs (sv_2mortal (newSVpv (token, 0))); + XPUSHs (sv_2mortal (newSVpv (value, 0))); + + token = strtok (NULL, ","); + } + + PUTBACK; +} + /* xs_init is the second argument perl_parse. As the name hints, it initializes XS subroutines (see the perlembed manpage) */ static void @@ -1292,31 +1358,36 @@ xs_init (pTHX) scripts by the 'use perlmod;' construction */ newXS ("DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__); /* load up all the custom IRC perl functions */ - newXS ("Xchat::Internal::register", XS_Xchat_register, __FILE__); - newXS ("Xchat::Internal::hook_server", XS_Xchat_hook_server, __FILE__); - newXS ("Xchat::Internal::hook_command", XS_Xchat_hook_command, __FILE__); - newXS ("Xchat::Internal::hook_print", XS_Xchat_hook_print, __FILE__); - newXS ("Xchat::Internal::hook_timer", XS_Xchat_hook_timer, __FILE__); - newXS ("Xchat::Internal::hook_fd", XS_Xchat_hook_fd, __FILE__); - newXS ("Xchat::Internal::unhook", XS_Xchat_unhook, __FILE__); - newXS ("Xchat::Internal::print", XS_Xchat_print, __FILE__); - newXS ("Xchat::Internal::command", XS_Xchat_command, __FILE__); - newXS ("Xchat::Internal::set_context", XS_Xchat_set_context, __FILE__); - newXS ("Xchat::Internal::get_info", XS_Xchat_get_info, __FILE__); - newXS ("Xchat::Internal::context_info", XS_Xchat_context_info, __FILE__); - newXS ("Xchat::Internal::get_list", XS_Xchat_get_list, __FILE__); + newXS ("HexChat::Internal::register", XS_HexChat_register, __FILE__); + newXS ("HexChat::Internal::hook_server", XS_HexChat_hook_server, __FILE__); + newXS ("HexChat::Internal::hook_command", XS_HexChat_hook_command, __FILE__); + newXS ("HexChat::Internal::hook_print", XS_HexChat_hook_print, __FILE__); + newXS ("HexChat::Internal::hook_timer", XS_HexChat_hook_timer, __FILE__); + newXS ("HexChat::Internal::hook_fd", XS_HexChat_hook_fd, __FILE__); + newXS ("HexChat::Internal::unhook", XS_HexChat_unhook, __FILE__); + newXS ("HexChat::Internal::print", XS_HexChat_print, __FILE__); + newXS ("HexChat::Internal::command", XS_HexChat_command, __FILE__); + newXS ("HexChat::Internal::set_context", XS_HexChat_set_context, __FILE__); + newXS ("HexChat::Internal::get_info", XS_HexChat_get_info, __FILE__); + newXS ("HexChat::Internal::context_info", XS_HexChat_context_info, __FILE__); + newXS ("HexChat::Internal::get_list", XS_HexChat_get_list, __FILE__); + + newXS ("HexChat::Internal::plugin_pref_set", XS_HexChat_plugin_pref_set, __FILE__); + newXS ("HexChat::Internal::plugin_pref_get", XS_HexChat_plugin_pref_get, __FILE__); + newXS ("HexChat::Internal::plugin_pref_delete", XS_HexChat_plugin_pref_delete, __FILE__); + newXS ("HexChat::Internal::plugin_pref_list", XS_HexChat_plugin_pref_list, __FILE__); - newXS ("Xchat::find_context", XS_Xchat_find_context, __FILE__); - newXS ("Xchat::get_context", XS_Xchat_get_context, __FILE__); - newXS ("Xchat::get_prefs", XS_Xchat_get_prefs, __FILE__); - newXS ("Xchat::emit_print", XS_Xchat_emit_print, __FILE__); - newXS ("Xchat::send_modes", XS_Xchat_send_modes, __FILE__); - newXS ("Xchat::nickcmp", XS_Xchat_nickcmp, __FILE__); - - newXS ("Xchat::Embed::plugingui_remove", XS_Xchat_Embed_plugingui_remove, + newXS ("HexChat::find_context", XS_HexChat_find_context, __FILE__); + newXS ("HexChat::get_context", XS_HexChat_get_context, __FILE__); + newXS ("HexChat::get_prefs", XS_HexChat_get_prefs, __FILE__); + newXS ("HexChat::emit_print", XS_HexChat_emit_print, __FILE__); + newXS ("HexChat::send_modes", XS_HexChat_send_modes, __FILE__); + newXS ("HexChat::nickcmp", XS_HexChat_nickcmp, __FILE__); + + newXS ("HexChat::Embed::plugingui_remove", XS_HexChat_Embed_plugingui_remove, __FILE__); - stash = get_hv ("Xchat::", TRUE); + stash = get_hv ("HexChat::", TRUE); if (stash == NULL) { exit (1); } @@ -1328,7 +1399,8 @@ xs_init (pTHX) newCONSTSUB (stash, "PRI_LOWEST", newSViv (HEXCHAT_PRI_LOWEST)); newCONSTSUB (stash, "EAT_NONE", newSViv (HEXCHAT_EAT_NONE)); - newCONSTSUB (stash, "EAT_XCHAT", newSViv (HEXCHAT_EAT_HEXCHAT)); + newCONSTSUB (stash, "EAT_HEXCHAT", newSViv (HEXCHAT_EAT_HEXCHAT)); + newCONSTSUB (stash, "EAT_XCHAT", newSViv (HEXCHAT_EAT_HEXCHAT)); /* for compatibility */ newCONSTSUB (stash, "EAT_PLUGIN", newSViv (HEXCHAT_EAT_PLUGIN)); newCONSTSUB (stash, "EAT_ALL", newSViv (HEXCHAT_EAT_ALL)); newCONSTSUB (stash, "FD_READ", newSViv (HEXCHAT_FD_READ)); @@ -1338,7 +1410,7 @@ xs_init (pTHX) newCONSTSUB (stash, "KEEP", newSViv (1)); newCONSTSUB (stash, "REMOVE", newSViv (0)); - version = get_sv( "Xchat::VERSION", 1 ); + version = get_sv( "HexChat::VERSION", 1 ); sv_setpv( version, PACKAGE_VERSION ); } @@ -1352,7 +1424,7 @@ perl_init (void) static const char xchat_definitions[] = { /* Redefine the $SIG{__WARN__} handler to have HexChat printing warnings in the main window. (TheHobbit) */ -#include "xchat.pm.h" +#include "hexchat.pm.h" }; #ifdef OLD_PERL static const char irc_definitions[] = { @@ -1448,7 +1520,7 @@ perl_load_file (char *filename) perl_init (); } - return execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::load", 0)), + return execute_perl (sv_2mortal (newSVpv ("HexChat::Embed::load", 0)), filename); } @@ -1458,7 +1530,7 @@ perl_end (void) { if (my_perl != NULL) { - execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::unload_all", 0)), ""); + execute_perl (sv_2mortal (newSVpv ("HexChat::Embed::unload_all", 0)), ""); PL_perl_destruct_level = 1; perl_destruct (my_perl); perl_free (my_perl); @@ -1472,7 +1544,7 @@ static int perl_command_unloadall (char *word[], char *word_eol[], void *userdata) { if (my_perl != NULL) { - execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::unload_all", 0)), ""); + execute_perl (sv_2mortal (newSVpv ("HexChat::Embed::unload_all", 0)), ""); return HEXCHAT_EAT_HEXCHAT; } @@ -1483,7 +1555,7 @@ static int perl_command_reloadall (char *word[], char *word_eol[], void *userdata) { if (my_perl != NULL) { - execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::reload_all", 0)), ""); + execute_perl (sv_2mortal (newSVpv ("HexChat::Embed::reload_all", 0)), ""); return HEXCHAT_EAT_HEXCHAT; } else { @@ -1512,7 +1584,7 @@ perl_command_unload (char *word[], char *word_eol[], void *userdata) char *file = get_filename (word, word_eol); if (my_perl != NULL && file != NULL) { - execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::unload", 0)), file); + execute_perl (sv_2mortal (newSVpv ("HexChat::Embed::unload", 0)), file); return HEXCHAT_EAT_HEXCHAT; } @@ -1525,7 +1597,7 @@ perl_command_reload (char *word[], char *word_eol[], void *eat) char *file = get_filename (word, word_eol); if (my_perl != NULL && file != NULL) { - execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::reload", 0)), file); + execute_perl (sv_2mortal (newSVpv ("HexChat::Embed::reload", 0)), file); return HEXCHAT_EAT_HEXCHAT; } @@ -1535,6 +1607,15 @@ perl_command_reload (char *word[], char *word_eol[], void *eat) return HEXCHAT_EAT_NONE; } +static int +perl_command_eval (char *word[], char *word_eol[], void *userdata) +{ + if (my_perl != NULL) + execute_perl (sv_2mortal (newSVpv ("HexChat::Embed::evaluate", 0)), word_eol[2]); + + return HEXCHAT_EAT_HEXCHAT; +} + void hexchat_plugin_get_info (char **name, char **desc, char **version, void **reserved) @@ -1572,12 +1653,15 @@ hexchat_plugin_init (hexchat_plugin * plugin_handle, char **plugin_name, 0); hexchat_hook_command (ph, "reload", HEXCHAT_PRI_NORM, perl_command_reload, 0, 0); - hexchat_hook_command (ph, "pl_reload", HEXCHAT_PRI_NORM, perl_command_reload, 0, - (int*)1); + hexchat_hook_command (ph, "pl_reload", HEXCHAT_PRI_NORM, perl_command_reload, + "Reloads a Perl script. Syntax: /pl_reload <filename.pl>", (int*)1); hexchat_hook_command (ph, "unloadall", HEXCHAT_PRI_NORM, - perl_command_unloadall, 0, 0); + perl_command_unloadall, "Unloads all loaded Perl scripts.", 0); hexchat_hook_command (ph, "reloadall", HEXCHAT_PRI_NORM, - perl_command_reloadall, 0, 0); + perl_command_reloadall, "Realoads all loaded Perl scripts.", 0); + + hexchat_hook_command (ph, "pl", HEXCHAT_PRI_NORM, + perl_command_eval, "Evaluates Perl code. Syntax: /pl <perl code>", 0); /*perl_init (); */ hexchat_hook_timer (ph, 0, perl_auto_load, NULL ); |