diff options
55 files changed, 3753 insertions, 856 deletions
@@ -1,7 +1,7 @@ WeeChat ChangeLog ================= Sébastien Helleu <flashcode@flashtux.org> -v0.3.4-dev, 2010-08-20 +v0.3.4-dev, 2010-08-27 Version 0.3.4 (under dev!) @@ -10,6 +10,9 @@ Version 0.3.4 (under dev!) * core: use similar behaviour for keys bound to local or global history (bug #30759) * api: add priority for hooks (task #10550) +* api: add new functions: hashtable_get_string, hook_info_hashtable, + info_get_hashtable +* irc: add new info_hashtable "irc_parse_message" * irc: fix bug with hostmasks in command /ignore (bug #30716) * rmodifier: new plugin "rmodifier": alter modifier strings with regular expressions (bug #26964) diff --git a/debian/control b/debian/control index 3f005b3e3..3262d62fa 100644 --- a/debian/control +++ b/debian/control @@ -5,7 +5,7 @@ Maintainer: Emmanuel Bouthenot <kolter@openics.org> Build-Depends-Indep: asciidoc (>= 8.2), source-highlight Build-Depends: debhelper (>= 7.0.50), cmake, libncursesw5-dev, ruby, ruby1.8-dev, libperl-dev, python-dev, libaspell-dev, liblua5.1-0-dev, - tcl-dev, libgnutls-dev, dpkg-dev (>= 1.13.19), pkg-config + tcl8.5-dev, libgnutls-dev, dpkg-dev (>= 1.13.19), pkg-config Standards-Version: 3.8.3 Homepage: http://weechat.org/ Vcs-Git: git://git.debian.org/users/kolter-guest/weechat.git diff --git a/doc/de/autogen/plugin_api/infos_hashtable.txt b/doc/de/autogen/plugin_api/infos_hashtable.txt new file mode 100644 index 000000000..7e89db725 --- /dev/null +++ b/doc/de/autogen/plugin_api/infos_hashtable.txt @@ -0,0 +1,7 @@ +[width="100%",cols="^1,^2,6,6,6",options="header"] +|======================================== +| Erweiterung | Name | Beschreibung | Hashtable (input) | Hashtable (output) + +| irc | irc_parse_message | parse an IRC message | "message": IRC message | "nick": nick, "host": host, "command": command, "channel": channel, "arguments": arguments (includes channel) + +|======================================== diff --git a/doc/de/weechat_scripting.de.txt b/doc/de/weechat_scripting.de.txt index 0ac0428ca..daa73ee8a 100644 --- a/doc/de/weechat_scripting.de.txt +++ b/doc/de/weechat_scripting.de.txt @@ -279,7 +279,7 @@ Liste der Skript API Funktionen: hook_command, hook_command_run, hook_timer, hook_fd, hook_process, hook_connect, hook_print, hook_signal, hook_signal_send, hook_config, hook_completion, hook_completion_list_add, hook_modifier, hook_modifier_exec, - hook_info, hook_infolist, unhook, unhook_all + hook_info, hook_info_hashtable, hook_infolist, unhook, unhook_all | Buffer | buffer_new, current_buffer, buffer_search, buffer_search_main, buffer_clear, buffer_close, buffer_merge, buffer_unmerge, buffer_get_integer, @@ -298,7 +298,7 @@ Liste der Skript API Funktionen: | Befehle | command | Informationen | - info_get + info_get, info_get_hashtable | Infolisten | infolist_new, infolist_new_item, infolist_new_var_integer, infolist_new_var_string, infolist_new_var_pointer, infolist_new_var_time, + diff --git a/doc/de/weechat_user.de.txt b/doc/de/weechat_user.de.txt index 9ec51b603..f72fb46e9 100644 --- a/doc/de/weechat_user.de.txt +++ b/doc/de/weechat_user.de.txt @@ -98,7 +98,7 @@ welche Pakete optional genutzt werden können. | python-dev | nein | python Erweiterung | ruby1.8-dev | nein | ruby Erweiterung | liblua5.1-0-dev | nein | lua Erweiterung -| tcl-dev | nein | tcl Erweiterung +| tcl-dev (>= 8.5) | nein | tcl Erweiterung | asciidoc (>= 8.2) | nein | erstellt Dokumentation (HTML Dateien) | source-highlight | nein | Syntax highlight für Quelltext in HTML Dokumentation |======================================== @@ -515,7 +515,7 @@ Tastenbefehle für die Befehlszeile // TRANSLATION MISSING | Ctrl + R | Sucht nach einem Text in der Protokolldatei (zweimaliges Drücken: sucht nach exaktem Text), - next/previous occurences can be found with up and down arrows + + next/previous occurrences can be found with up and down arrows + `/input search_text` | Ctrl + T | diff --git a/doc/docgen.pl b/doc/docgen.pl index 951c4a67b..d138b8e4b 100644 --- a/doc/docgen.pl +++ b/doc/docgen.pl @@ -93,6 +93,9 @@ my @ignore_options = ("aspell\\.dict\\..*", # infos to ignore my @ignore_infos_plugins = (); +# infos (hashtable) to ignore +my @ignore_infos_hashtable_plugins = (); + # infolists to ignore my @ignore_infolists_plugins = (); @@ -204,7 +207,7 @@ sub get_infos my $plugin = weechat::infolist_string($infolist, "plugin_name"); $plugin = "weechat" if ($plugin eq ""); - # check if infolist is ignored or not + # check if info is ignored or not my $ignore = 0; foreach my $mask (@ignore_infos_plugins) { @@ -222,6 +225,38 @@ sub get_infos return %infos; } +# get list of infos (hashtable) hooked by plugins in a hash with 3 indexes: plugin, name, xxx +sub get_infos_hashtable +{ + my %infos_hashtable; + + # get infos hooked + my $infolist = weechat::infolist_get("hook", "", "info_hashtable"); + while (weechat::infolist_next($infolist)) + { + my $info_name = weechat::infolist_string($infolist, "info_name"); + my $plugin = weechat::infolist_string($infolist, "plugin_name"); + $plugin = "weechat" if ($plugin eq ""); + + # check if info_hashtable is ignored or not + my $ignore = 0; + foreach my $mask (@ignore_infos_hashtable_plugins) + { + $ignore = 1 if ($plugin =~ /${mask}/); + } + + if ($ignore ne 1) + { + $infos_hashtable{$plugin}{$info_name}{"description"} = weechat::infolist_string($infolist, "description"); + $infos_hashtable{$plugin}{$info_name}{"args_description"} = weechat::infolist_string($infolist, "args_description"); + $infos_hashtable{$plugin}{$info_name}{"output_description"} = weechat::infolist_string($infolist, "output_description"); + } + } + weechat::infolist_free($infolist); + + return %infos_hashtable; +} + # get list of infolists hooked by plugins in a hash with 3 indexes: plugin, name, xxx sub get_infolists { @@ -313,6 +348,7 @@ sub docgen my %plugin_commands = get_commands(); my %plugin_options = get_options(); my %plugin_infos = get_infos(); + my %plugin_infos_hashtable = get_infos_hashtable(); my %plugin_infolists = get_infolists(); my %plugin_completions = get_completions(); @@ -335,6 +371,8 @@ sub docgen my $num_files_options_updated = 0; my $num_files_infos = 0; my $num_files_infos_updated = 0; + my $num_files_infos_hashtable = 0; + my $num_files_infos_hashtable_updated = 0; my $num_files_infolists = 0; my $num_files_infolists_updated = 0; my $num_files_completions = 0; @@ -529,6 +567,55 @@ sub docgen weechat::print("", weechat::prefix("error")."docgen error: unable to write file '$filename'"); } + # write infos (hashtable) hooked + $filename = $dir."plugin_api/infos_hashtable.txt"; + if (open(FILE, ">".$filename.".tmp")) + { + print FILE "[width=\"100%\",cols=\"^1,^2,6,6,6\",options=\"header\"]\n"; + print FILE "|========================================\n"; + print FILE "| ".weechat_gettext("Plugin")." | ".weechat_gettext("Name") + ." | ".weechat_gettext("Description")." | ".weechat_gettext("Hashtable (input)") + ." | ".weechat_gettext("Hashtable (output)")."\n\n"; + foreach my $plugin (sort keys %plugin_infos_hashtable) + { + foreach my $info (sort keys %{$plugin_infos_hashtable{$plugin}}) + { + my $description = $plugin_infos_hashtable{$plugin}{$info}{"description"}; + $description = $d->get($description) if ($description ne ""); + my $args_description = $plugin_infos_hashtable{$plugin}{$info}{"args_description"}; + $args_description = $d->get($args_description) if ($args_description ne ""); + $args_description = "-" if ($args_description eq ""); + my $output_description = $plugin_infos_hashtable{$plugin}{$info}{"output_description"}; + $output_description = $d->get($output_description) if ($output_description ne ""); + $output_description = "-" if ($output_description eq ""); + + print FILE "| ".escape_table($plugin)." | ".escape_table($info) + ." | ".escape_table($description)." | ".escape_table($args_description) + ." | ".escape_table($output_description)."\n\n"; + } + } + print FILE "|========================================\n"; + #weechat::print("", "docgen: file ok: '$filename'"); + my $rc = system("diff ".$filename." ".$filename.".tmp >/dev/null 2>&1"); + if ($rc != 0) + { + system("mv -f ".$filename.".tmp ".$filename); + $num_files_updated++; + $num_files_infos_hashtable_updated++; + } + else + { + system("rm ".$filename.".tmp"); + } + $num_files++; + $num_files_infos_hashtable++; + close(FILE); + } + else + { + weechat::print("", weechat::prefix("error")."docgen error: unable to write file '$filename'"); + } + # write infolists hooked $filename = $dir."plugin_api/infolists.txt"; if (open(FILE, ">".$filename.".tmp")) @@ -624,20 +711,24 @@ sub docgen weechat::print("", weechat::prefix("error")."docgen error: directory '$dir' does not exist"); } my $total_files = $num_files_commands + $num_files_options - + $num_files_infos + $num_files_infolists + $num_files_completions; + + $num_files_infos + $num_files_infos_hashtable + + $num_files_infolists + $num_files_completions; my $total_files_updated = $num_files_commands_updated + $num_files_options_updated + $num_files_infos_updated - + $num_files_infolists_updated + $num_files_completions_updated; + + $num_files_infos_hashtable_updated + $num_files_infolists_updated + + $num_files_completions_updated; weechat::print("", "docgen: ".$locale.": ".$total_files." files (" .$num_files_commands." cmd, " .$num_files_options." opt, " .$num_files_infos." infos, " + .$num_files_infos." infos (hashtable), " .$num_files_infolists." infolists, " .$num_files_completions." complt) -- " .$total_files_updated." updated (" .$num_files_commands_updated." cmd, " .$num_files_options_updated." opt, " .$num_files_infos_updated." infos, " + .$num_files_infos_hashtable_updated." infos (hashtable), " .$num_files_infolists_updated." infolists, " .$num_files_completions_updated." complt)"); } diff --git a/doc/en/autogen/plugin_api/infos_hashtable.txt b/doc/en/autogen/plugin_api/infos_hashtable.txt new file mode 100644 index 000000000..c5c1dcfb4 --- /dev/null +++ b/doc/en/autogen/plugin_api/infos_hashtable.txt @@ -0,0 +1,7 @@ +[width="100%",cols="^1,^2,6,6,6",options="header"] +|======================================== +| Plugin | Name | Description | Hashtable (input) | Hashtable (output) + +| irc | irc_parse_message | parse an IRC message | "message": IRC message | "nick": nick, "host": host, "command": command, "channel": channel, "arguments": arguments (includes channel) + +|======================================== diff --git a/doc/en/weechat_plugin_api.en.txt b/doc/en/weechat_plugin_api.en.txt index 9e80d7c4e..f96100103 100644 --- a/doc/en/weechat_plugin_api.en.txt +++ b/doc/en/weechat_plugin_api.en.txt @@ -505,6 +505,9 @@ char *str = weechat_strndup ("abcdef", 3); /* result: "abc" */ free (str); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_tolower ^^^^^^^^^^^^^^^^^^^^^^ @@ -529,6 +532,9 @@ char *str = "AbCdé"; weechat_string_tolower (str); /* str is now: "abcdé" */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_toupper ^^^^^^^^^^^^^^^^^^^^^^ @@ -553,6 +559,9 @@ char *str = "AbCdé"; weechat_string_tolower (str); /* str is now: "ABCDé" */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_strcasecmp ^^^^^^^^^^^^^^^^^^ @@ -584,6 +593,9 @@ C example: int diff = weechat_strcasecmp ("aaa", "CCC"); /* == -2 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_strncasecmp ^^^^^^^^^^^^^^^^^^^ @@ -616,6 +628,9 @@ C example: int diff = weechat_strncasecmp ("aabb", "aacc", 2); /* == 0 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_strcmp_ignore_chars ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -652,6 +667,9 @@ C example: int diff = weechat_strcmp_ignore_chars ("a-b", "--a-e", "-", 1); /* == -3 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_strcasestr ^^^^^^^^^^^^^^^^^^ @@ -680,6 +698,9 @@ C example: char *pos = weechat_strcasestr ("aBcDeF", "de"); /* result: pointer to "DeF" */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_match ^^^^^^^^^^^^^^^^^^^^ @@ -730,7 +751,7 @@ match4 = weechat.string_match("abcdef", "*de*", 0) # 1 weechat_string_replace ^^^^^^^^^^^^^^^^^^^^^^ -Replace all occurences of a string by another string. +Replace all occurrences of a string by another string. Prototype: @@ -760,6 +781,9 @@ char *str = weechat_string_replace ("test", "s", "x"); /* result: "text" */ free (str); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_expand_home ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -794,6 +818,9 @@ char *str = weechat_string_expand_home ("~/file.txt"); free (str); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_remove_quotes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -827,6 +854,9 @@ char *str = weechat_string_remove_quotes (string, " 'I can't' ", "'"); free (str); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_strip ^^^^^^^^^^^^^^^^^^^^ @@ -860,6 +890,9 @@ char *str = weechat_string_strip (".abc -", 0, 1, "- ."); /* result: ".abc" */ free (str); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_has_highlight ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -995,6 +1028,9 @@ argv = weechat_string_split ("abc de fghi", " ", 1, 0, &argc); weechat_string_free_split (argv); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_free_split ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1023,6 +1059,9 @@ argv = weechat_string_split (string, " ", 0, 0, &argc); weechat_string_free_split (argv); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_build_with_split_string ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1059,6 +1098,9 @@ char *str = weechat_string_build_with_split_string (argv, ";"); free (str); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_split_command ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1093,6 +1135,9 @@ char **argv = weechat_string_split_command ("/command1 arg;/command2", ';'); weechat_free_split_command (argv); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_free_split_command ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1119,6 +1164,9 @@ char **argv = weechat_string_split_command ("/command1 arg;/command2", ';'); weechat_free_split_command (argv); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_format_size ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1163,6 +1211,9 @@ char *str = weechat_string_format_size (2097152); /* str == "2 MB" */ free (str); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_remove_color ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1243,6 +1294,9 @@ weechat_string_encode_base64 (string, strlen (string), result); /* result == "YWJjZGVmZ2g=" */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_decode_base64 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1277,6 +1331,9 @@ length = weechat_string_decode_base64 (string, result); /* length == 8, result == "abcdefgh" */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_string_is_command_char ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1400,6 +1457,9 @@ if (weechat_utf8_has_8bits (string)) } ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_is_valid ^^^^^^^^^^^^^^^^^^^^^ @@ -1437,6 +1497,9 @@ else } ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_normalize ^^^^^^^^^^^^^^^^^^^^^^ @@ -1461,6 +1524,9 @@ C example: weechat_utf8_normalize (string, '?'); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_prev_char ^^^^^^^^^^^^^^^^^^^^^^ @@ -1490,6 +1556,9 @@ C example: char *prev_char = weechat_utf8_prev_char (string, ptr_in_string); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_next_char ^^^^^^^^^^^^^^^^^^^^^^ @@ -1517,6 +1586,9 @@ C example: char *next_char = weechat_utf8_next_char (string); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_char_int ^^^^^^^^^^^^^^^^^^^^^ @@ -1544,6 +1616,9 @@ C example: int char_int = weechat_utf8_char_int ("être"); /* "ê" as integer */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_char_size ^^^^^^^^^^^^^^^^^^^^^^ @@ -1571,6 +1646,9 @@ C example: int char_size = weechat_utf8_char_size ("être"); /* == 2 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_strlen ^^^^^^^^^^^^^^^^^^^ @@ -1598,6 +1676,9 @@ C example: int length = weechat_utf8_strlen ("chêne"); /* == 5 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_strnlen ^^^^^^^^^^^^^^^^^^^^ @@ -1626,6 +1707,9 @@ C example: int length = weechat_utf8_strnlen ("chêne", 4); /* == 3 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_strlen_screen ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1653,6 +1737,9 @@ C example: int length_on_screen = weechat_utf8_strlen_screen ("é"); /* == 1 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_charcmp ^^^^^^^^^^^^^^^^^^^^ @@ -1684,6 +1771,9 @@ C example: int diff = weechat_utf8_charcmp ("aaa", "ccc"); /* == -2 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_charcasecmp ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1715,6 +1805,9 @@ C example: int diff = weechat_utf8_charcasecmp ("aaa", "CCC"); /* == -2 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_char_size_screen ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1742,6 +1835,9 @@ C example: int length_on_screen = weechat_utf8_char_size_screen ("é"); /* == 1 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_add_offset ^^^^^^^^^^^^^^^^^^^^^^^ @@ -1771,6 +1867,9 @@ char *str = "chêne"; char *str2 = weechat_utf8_add_offset (str, 3); /* points to "ne" */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_real_pos ^^^^^^^^^^^^^^^^^^^^^ @@ -1799,6 +1898,9 @@ C example: int pos = weechat_utf8_real_pos ("chêne", 3); /* == 4 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_pos ^^^^^^^^^^^^^^^^ @@ -1827,6 +1929,9 @@ C example: int pos = weechat_utf8_pos ("chêne", 4); /* == 3 */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_utf8_strndup ^^^^^^^^^^^^^^^^^^^^ @@ -1857,6 +1962,9 @@ char *string = weechat_utf8_strndup ("chêne", 3); /* returns "chê" */ free (string); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + [[directories]] Directories ~~~~~~~~~~~ @@ -2026,6 +2134,9 @@ void callback (void *data, const char *filename) weechat_exec_on_files ("/tmp", 0, NULL, &callback); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_file_get_content ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2059,6 +2170,9 @@ content = weechat_file_get_content ("/tmp/test.txt"); free (content); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + [[util]] Util ~~~~ @@ -2098,6 +2212,9 @@ if (weechat_util_timeval_cmp (&tv1, &tv2) > 0) } ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_util_timeval_diff ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2126,6 +2243,9 @@ C example: long diff = weechat_util_timeval_diff (&tv1, &tv2); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_util_timeval_add ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2150,6 +2270,9 @@ C example: weechat_util_timeval_add (&tv, 2000); /* add 2 seconds */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_util_get_time_string ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2177,6 +2300,9 @@ weechat_printf (NULL, "date: %s", weechat_util_get_time_string (&date)); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + [[sorted_lists]] Sorted lists ~~~~~~~~~~~~ @@ -2742,6 +2868,9 @@ struct t_hashtable *hashtable = weechat_hashtable_new (8, NULL); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_hashtable_set_with_size ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2780,6 +2909,9 @@ weechat_hashtable_set_with_size (hashtable, "my_key", 0, my_buffer, sizeof (my_buffer_struct)); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_hashtable_set ^^^^^^^^^^^^^^^^^^^^^ @@ -2812,6 +2944,9 @@ C example: weechat_hashtable_set (hashtable, "my_key", "my_value"); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_hashtable_get ^^^^^^^^^^^^^^^^^^^^^ @@ -2842,6 +2977,9 @@ C example: void *value = weechat_hashtable_get (hashtable, "my_key"); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_hashtable_map ^^^^^^^^^^^^^^^^^^^^^ @@ -2884,6 +3022,9 @@ map_cb (void *data, struct t_hashtable *hashtable, weechat_hashtable_map (hashtable, &map_cb, NULL); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_hashtable_get_integer ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2917,6 +3058,55 @@ C example: int items_count = weechat_hashtable_get_integer (hashtable, "items_count"); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + +weechat_hashtable_get_string +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +_New in version 0.3.4._ + +Return string value of a hashtable property. + +Prototype: + +[source,C] +---------------------------------------- +const char *weechat_hashtable_get_string (struct t_hashtable *hashtable, + void *property); +---------------------------------------- + +Arguments: + +* 'hashtable': hashtable pointer +* 'property': property name: +** 'type_keys': type for keys: +*** 'integer': integer +*** 'string': string +*** 'pointer': pointer +*** 'buffer': buffer +*** 'time': time +** 'type_values': type for values: +*** 'integer': integer +*** 'string': string +*** 'pointer': pointer +*** 'buffer': buffer +*** 'time': time + +Return value: + +* string value of property + +C example: + +[source,C] +---------------------------------------- +const char *type_keys = weechat_hashtable_get_string (hashtable, "type_keys"); +---------------------------------------- + +[NOTE] +This function is not available in scripting API. + weechat_hashtable_add_to_infolist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2960,6 +3150,9 @@ weechat_hashtable_add_to_infolist (hashtable, infolist_item, "testhash"); */ ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_hashtable_remove ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2986,6 +3179,9 @@ C example: weechat_hashtable_remove (hashtable, "my_key"); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_hashtable_remove_all ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3011,6 +3207,9 @@ C example: weechat_hashtable_remove_all (hashtable); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_hashtable_free ^^^^^^^^^^^^^^^^^^^^^^ @@ -3036,6 +3235,9 @@ C example: weechat_hashtable_free (hashtable); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + [[configuration_files]] Configuration files ~~~~~~~~~~~~~~~~~~~ @@ -3665,6 +3867,9 @@ else } ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_config_search_with_string ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3712,6 +3917,9 @@ else } ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_config_string_to_boolean ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -4084,6 +4292,9 @@ C example: char *description = weechat_config_option_get_pointer (option, "description"); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_config_option_is_null ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -5349,6 +5560,9 @@ C example: weechat_printf_date (NULL, time (NULL) - 120, "Hello, 2 minutes ago"); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_printf_tags ^^^^^^^^^^^^^^^^^^^ @@ -5376,6 +5590,9 @@ weechat_printf_tags (NULL, "notify_message", "Message with a tag 'notify_message'"); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_printf_date_tags ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -6870,7 +7087,7 @@ weechat.hook_modifier_exec("my_modifier", my_data, my_string) weechat_hook_info ^^^^^^^^^^^^^^^^^ -Hook an information. +Hook an information (callback takes and returns a string). Prototype: @@ -6934,6 +7151,82 @@ hook = weechat.hook_info("my_info", "Some info", "Info about arguments", "my_info_cb", "") ---------------------------------------- +weechat_hook_info_hashtable +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +_New in version 0.3.4._ + +Hook an information (callback takes and returns a hashtable). + +Prototype: + +[source,C] +---------------------------------------- +struct t_hook *weechat_hook_info_hashtable (const char *info_name, + const char *description, + const char *args_description, + const char *output_description, + struct t_hashtable *(*callback)(void *data, + const char *info_name, + struct t_hashtable *hashtable), + void *callback_data); +---------------------------------------- + +Arguments: + +* 'info_name': name of info + (priority allowed, see note about <<hook_priority,priority>>) +* 'description': description +* 'args_description': description of expected hashtable (optional, can be NULL) +* 'output_description': description of hashtable returned by callback + (optional, can be NULL) +* 'callback': function called when info is asked, arguments: +** 'void *data': pointer +** 'const char *info_name': name of info +** 'struct t_hashtable *hashtable': hashtable, depending on info +* 'callback_data': pointer given to callback when it is called by WeeChat + +Return value: + +* pointer to new hook, NULL if error occured + +C example: + +[source,C] +---------------------------------------- +struct t_hashtable * +my_info_hashtable_cb (void *data, const char *info_name, struct t_hashtable *hashtable) +{ + /* ... */ + return pointer_to_new_hashtable; +} + +/* add info "my_info_hashtable" */ +struct t_hook *my_info_hook = weechat_hook_info_hashtable ("my_info_hashtable", + "Some info", + "Info about input hashtable", + "Info about output hashtable", + &my_info_hashtable_cb, NULL); +---------------------------------------- + +Script (Python): + +[source,python] +---------------------------------------- +# prototype +hook = weechat.hook_info_hashtable(info_name, description, args_description, + output_description, callback, callback_data) + +# example +def my_info_hashtable_cb(data, info_name, hashtable): + return { "test_key": "test_value" } + +hook = weechat.hook_info_hashtable("my_info_hashtable", "Some info", + "Info about input hashtable", + "Info about output hashtable", + "my_info_hashtable_cb", "") +---------------------------------------- + weechat_hook_infolist ^^^^^^^^^^^^^^^^^^^^^ @@ -7800,6 +8093,9 @@ my_close_cb (void *data, struct t_gui_buffer *buffer) weechat_buffer_set_pointer (my_buffer, "close_callback", &my_close_cb); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_buffer_string_replace_local_var ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -8903,6 +9199,9 @@ else } ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_network_connect_to ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -8953,6 +9252,9 @@ else } ---------------------------------------- +[NOTE] +This function is not available in scripting API. + [[infos]] Infos ~~~~~ @@ -8962,7 +9264,7 @@ Functions to get infos. weechat_info_get ^^^^^^^^^^^^^^^^ -Return info from WeeChat or a plugin. +Return info, as string, from WeeChat or a plugin. Prototype: @@ -9006,6 +9308,75 @@ weechat.prnt("", "Current WeeChat version is: %s (compiled on %s)" weechat.prnt("", "WeeChat home is: %s" % weechat.info_get("weechat_dir", "")) ---------------------------------------- +weechat_info_get_hashtable +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +_New in version 0.3.4._ + +Return info, as hashtable, from WeeChat or a plugin. + +Prototype: + +[source,C] +---------------------------------------- +struct t_hashtable *weechat_info_get_hashtable (const char *info_name, + struct t_hashtable *hashtable); +---------------------------------------- + +Arguments: + +* 'info_name': name of info to read: +include::autogen/plugin_api/infos_hashtable.txt[] +* 'hashtable': hashtable with arguments (depends on info asked) (optional, NULL + if no argument is needed) + +Return value: + +* hashtable with info asked, NULL if an error occured + +C example: + +[source,C] +---------------------------------------- +struct t_hashtable *hashtable_in, *hashtable_out; + +hashtable_in = weechat_hashtable_new (8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); +if (hashtable_in) +{ + weechat_hashtable_set (hashtable_in, "message", + ":nick!user@host PRIVMSG #weechat :message here"); + hashtable_out = weechat_info_get_hashtable ("irc_parse_message", + hashtable_in); + /* + * now hashtable_out has following keys/values: + * "nick" : "nick" + * "host" : "nick!user@host" + * "command" : "PRIVMSG" + * "channel" : "#weechat" + * "arguments": "#weechat :message here" + */ + weechat_hashtable_free (hashtable_in); + weechat_hashtable_free (hashtable_out); +} +---------------------------------------- + +Script (Python): + +[source,python] +---------------------------------------- +# prototype +dict = weechat.info_get_hashtable(info_name, dict_in) + +# example +dict_in = { "message": ":nick!user@host PRIVMSG #weechat :message here" } +weechat.prnt("", "message parsed: %s" + % weechat.info_get_hashtable("irc_parse_message", dict_in)) +---------------------------------------- + [[infolists]] Infolists ~~~~~~~~~ @@ -9266,6 +9637,9 @@ struct t_infolist_var *var = weechat_infolist_new_variable_buffer (item, sizeof (buffer)); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_infolist_new_var_time ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -9687,6 +10061,9 @@ weechat_printf (NULL, "buffer = 0x%lx, size = %d", pointer, size); ---------------------------------------- +[NOTE] +This function is not available in scripting API. + weechat_infolist_time ^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/en/weechat_scripting.en.txt b/doc/en/weechat_scripting.en.txt index 94ca235de..2f46e3d8c 100644 --- a/doc/en/weechat_scripting.en.txt +++ b/doc/en/weechat_scripting.en.txt @@ -272,7 +272,7 @@ List of functions in script API: hook_command, hook_command_run, hook_timer, hook_fd, hook_process, hook_connect, hook_print, hook_signal, hook_signal_send, hook_config, hook_completion, hook_completion_list_add, hook_modifier, hook_modifier_exec, - hook_info, hook_infolist, unhook, unhook_all + hook_info, hook_info_hashtable, hook_infolist, unhook, unhook_all | buffers | buffer_new, current_buffer, buffer_search, buffer_search_main, buffer_clear, buffer_close, buffer_merge, buffer_unmerge, buffer_get_integer, @@ -291,7 +291,7 @@ List of functions in script API: | commands | command | infos | - info_get + info_get, info_get_hashtable | infolists | infolist_new, infolist_new_item, infolist_new_var_integer, infolist_new_var_string, infolist_new_var_pointer, infolist_new_var_time, + diff --git a/doc/en/weechat_user.en.txt b/doc/en/weechat_user.en.txt index 80655eb9b..61f3f94cc 100644 --- a/doc/en/weechat_user.en.txt +++ b/doc/en/weechat_user.en.txt @@ -98,7 +98,7 @@ compile WeeChat. | python-dev | no | python plugin | ruby1.8-dev | no | ruby plugin | liblua5.1-0-dev | no | lua plugin -| tcl-dev | no | tcl plugin +| tcl-dev (>= 8.5) | no | tcl plugin | asciidoc (>= 8.2) | no | build documentation (HTML files) | source-highlight | no | syntax highlight for sources in HTML documentation |======================================== @@ -515,7 +515,7 @@ Keys for command line | Ctrl + R | Search for text in buffer history (two times: search exact text), - next/previous occurences can be found with up and down arrows + + next/previous occurrences can be found with up and down arrows + `/input search_text` | Ctrl + T | diff --git a/doc/fr/autogen/plugin_api/infos_hashtable.txt b/doc/fr/autogen/plugin_api/infos_hashtable.txt new file mode 100644 index 000000000..ce3471b6e --- /dev/null +++ b/doc/fr/autogen/plugin_api/infos_hashtable.txt @@ -0,0 +1,7 @@ +[width="100%",cols="^1,^2,6,6,6",options="header"] +|======================================== +| Extension | Nom | Description | Hashtable (entrée) | Hashtable (sortie) + +| irc | irc_parse_message | analyse un message IRC | "message": message IRC | "nick": pseudo, "host": nom d'hôte, "command": commande, "channel": canal, "arguments": paramètres (inclut le canal) + +|======================================== diff --git a/doc/fr/weechat_plugin_api.fr.txt b/doc/fr/weechat_plugin_api.fr.txt index e37799c82..924ecb84c 100644 --- a/doc/fr/weechat_plugin_api.fr.txt +++ b/doc/fr/weechat_plugin_api.fr.txt @@ -512,6 +512,9 @@ char *str = weechat_strndup ("abcdef", 3); /* résultat : "abc" */ free (str); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_tolower ^^^^^^^^^^^^^^^^^^^^^^ @@ -536,6 +539,9 @@ char *str = "AbCdé"; weechat_string_tolower (str); /* str vaut maintenant : "abcdé" */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_toupper ^^^^^^^^^^^^^^^^^^^^^^ @@ -560,6 +566,9 @@ char *str = "AbCdé"; weechat_string_tolower (str); /* str vaut maintenant : "ABCDé" */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_strcasecmp ^^^^^^^^^^^^^^^^^^ @@ -591,6 +600,9 @@ Exemple en C : int diff = weechat_strcasecmp ("aaa", "CCC"); /* == -2 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_strncasecmp ^^^^^^^^^^^^^^^^^^^ @@ -624,6 +636,9 @@ Exemple en C : int diff = weechat_strncasecmp ("aabb", "aacc", 2); /* == 0 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_strcmp_ignore_chars ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -660,6 +675,9 @@ Exemple en C : int diff = weechat_strcmp_ignore_chars ("a-b", "--a-e", "-", 1); /* == -3 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_strcasestr ^^^^^^^^^^^^^^^^^^ @@ -688,6 +706,9 @@ Exemple en C : char *pos = weechat_strcasestr ("aBcDeF", "de"); /* résultat : pointeur vers "DeF" */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_match ^^^^^^^^^^^^^^^^^^^^ @@ -738,7 +759,7 @@ match4 = weechat.string_match("abcdef", "*de*", 0) # 1 weechat_string_replace ^^^^^^^^^^^^^^^^^^^^^^ -Remplace toutes les occurences d'une chaîne par une autre chaîne. +Remplace toutes les occurrences d'une chaîne par une autre chaîne. Prototype : @@ -768,6 +789,9 @@ char *str = weechat_string_replace ("test, test", "s", "x"); /* résultat : "tex free (str); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_expand_home ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -802,6 +826,9 @@ char *str = weechat_string_expand_home ("~/fichier.txt"); free (str); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_remove_quotes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -835,6 +862,9 @@ char *str = weechat_string_remove_quotes (string, " 'aujourd'hui' ", "'"); free (str); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_strip ^^^^^^^^^^^^^^^^^^^^ @@ -869,6 +899,9 @@ char *str = weechat_string_strip (".abc -", 0, 1, "- ."); /* résultat : ".abc" free (str); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_has_highlight ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1008,6 +1041,9 @@ argv = weechat_string_split ("abc de fghi", " ", 1, 0, &argc); weechat_string_free_split (argv); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_free_split ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1036,6 +1072,9 @@ argv = weechat_string_split (string, " ", 0, 0, &argc); weechat_string_free_split (argv); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_build_with_split_string ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1073,6 +1112,9 @@ char *str = weechat_string_build_with_split_string (argv, ";"); free (str); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_split_command ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1107,6 +1149,9 @@ char **argv = weechat_string_split_command ("/commande1 arg;/commande2", ';'); weechat_free_split_command (argv); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_free_split_command ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1133,6 +1178,9 @@ char **argv = weechat_string_split_command ("/commande1 arg;/commande2", ';'); weechat_free_split_command (argv); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_format_size ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1177,6 +1225,9 @@ char *str = weechat_string_format_size (2097152); /* str == "2 Mo" */ free (str); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_remove_color ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1258,6 +1309,9 @@ weechat_string_encode_base64 (string, strlen (string), result); /* result == "YWJjZGVmZ2g=" */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_decode_base64 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1292,6 +1346,9 @@ length = weechat_string_decode_base64 (string, result); /* length == 8, result == "abcdefgh" */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_string_is_command_char ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1417,6 +1474,9 @@ if (weechat_utf8_has_8bits (string)) } ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_is_valid ^^^^^^^^^^^^^^^^^^^^^ @@ -1454,6 +1514,9 @@ else } ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_normalize ^^^^^^^^^^^^^^^^^^^^^^ @@ -1479,6 +1542,9 @@ Exemple en C : weechat_utf8_normalize (string, '?'); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_prev_char ^^^^^^^^^^^^^^^^^^^^^^ @@ -1509,6 +1575,9 @@ Exemple en C : char *prev_char = weechat_utf8_prev_char (string, ptr_in_string); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_next_char ^^^^^^^^^^^^^^^^^^^^^^ @@ -1537,6 +1606,9 @@ Exemple en C : char *next_char = weechat_utf8_next_char (string); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_char_int ^^^^^^^^^^^^^^^^^^^^^ @@ -1564,6 +1636,9 @@ Exemple en C : int char_int = weechat_utf8_char_int ("être"); /* "ê" comme entier */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_char_size ^^^^^^^^^^^^^^^^^^^^^^ @@ -1591,6 +1666,9 @@ Exemple en C : int char_size = weechat_utf8_char_size ("être"); /* == 2 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_strlen ^^^^^^^^^^^^^^^^^^^ @@ -1618,6 +1696,9 @@ Exemple en C : int length = weechat_utf8_strlen ("chêne"); /* == 5 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_strnlen ^^^^^^^^^^^^^^^^^^^^ @@ -1647,6 +1728,9 @@ Exemple en C : int length = weechat_utf8_strnlen ("chêne", 4); /* == 3 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_strlen_screen ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1675,6 +1759,9 @@ Exemple en C : int length_on_screen = weechat_utf8_strlen_screen ("é"); /* == 1 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_charcmp ^^^^^^^^^^^^^^^^^^^^ @@ -1706,6 +1793,9 @@ Exemple en C : int diff = weechat_utf8_charcmp ("aaa", "ccc"); /* == -2 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_charcasecmp ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1737,6 +1827,9 @@ Exemple en C : int diff = weechat_utf8_charcasecmp ("aaa", "CCC"); /* == -2 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_char_size_screen ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1765,6 +1858,9 @@ Exemple en C : int length_on_screen = weechat_utf8_char_size_screen ("é"); /* == 1 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_add_offset ^^^^^^^^^^^^^^^^^^^^^^^ @@ -1795,6 +1891,9 @@ char *str = "chêne"; char *str2 = weechat_utf8_add_offset (str, 3); /* pointe vers "ne" */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_real_pos ^^^^^^^^^^^^^^^^^^^^^ @@ -1823,6 +1922,9 @@ Exemple en C : int pos = weechat_utf8_real_pos ("chêne", 3); /* == 4 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_pos ^^^^^^^^^^^^^^^^ @@ -1851,6 +1953,9 @@ Exemple en C : int pos = weechat_utf8_pos ("chêne", 4); /* == 3 */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_utf8_strndup ^^^^^^^^^^^^^^^^^^^^ @@ -1881,6 +1986,9 @@ char *string = weechat_utf8_strndup ("chêne", 3); /* retourne "chê" */ free (str); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + [[directories]] Répertoires ~~~~~~~~~~~ @@ -2051,6 +2159,9 @@ void callback (void *data, const char *filename) weechat_exec_on_files ("/tmp", 0, NULL, &callback); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_file_get_content ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2085,6 +2196,9 @@ contenu = weechat_file_get_content ("/tmp/test.txt"); free (contenu); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + [[util]] Util ~~~~ @@ -2124,6 +2238,9 @@ if (weechat_util_timeval_cmp (&tv1, &tv2) > 0) } ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_util_timeval_diff ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2152,6 +2269,9 @@ Exemple en C : long diff = weechat_util_timeval_diff (&tv1, &tv2); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_util_timeval_add ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2176,6 +2296,9 @@ Exemple en C : weechat_util_timeval_add (&tv, 2000); /* ajoute 2 secondes */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_util_get_time_string ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2203,6 +2326,9 @@ weechat_printf (NULL, "date: %s", weechat_util_get_time_string (&date)); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + [[sorted_lists]] Listes triées ~~~~~~~~~~~~~ @@ -2772,6 +2898,9 @@ struct t_hashtable *hashtable = weechat_hashtable_new (8, NULL); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_hashtable_set_with_size ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2811,6 +2940,9 @@ weechat_hashtable_set_with_size (hashtable, "ma_cle", 0, my_buffer, sizeof (my_buffer_struct)); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_hashtable_set ^^^^^^^^^^^^^^^^^^^^^ @@ -2843,6 +2975,9 @@ Exemple en C : weechat_hashtable_set (hashtable, "ma_cle", "ma_valeur"); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_hashtable_get ^^^^^^^^^^^^^^^^^^^^^ @@ -2873,6 +3008,9 @@ Exemple en C : void *value = weechat_hashtable_get (hashtable, "ma_cle"); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_hashtable_map ^^^^^^^^^^^^^^^^^^^^^ @@ -2915,6 +3053,9 @@ map_cb (void *data, struct t_hashtable *hashtable, weechat_hashtable_map (hashtable, &map_cb, NULL); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_hashtable_get_integer ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2939,7 +3080,7 @@ Paramètres : Valeur en retour : -* valeur entière de l'option +* valeur de la propriété sous forme d'entier Exemple en C : @@ -2948,6 +3089,55 @@ Exemple en C : int items_count = weechat_hashtable_get_integer (hashtable, "items_count"); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + +weechat_hashtable_get_string +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +_Nouveau dans la version 0.3.4._ + +Retourne une valeur pour une propriété d'une hashtable sous forme de chaîne. + +Prototype: + +[source,C] +---------------------------------------- +const char *weechat_hashtable_get_string (struct t_hashtable *hashtable, + void *property); +---------------------------------------- + +Arguments: + +* 'hashtable' : pointeur vers la hashtable +* 'property' : nom de la propriété : +** 'type_keys' : type pour les clés : +*** 'integer' : entier +*** 'string' : chaîne +*** 'pointer' : pointeur +*** 'buffer' : buffer +*** 'time' : heure +** 'type_values': type pour les valeurs : +*** 'integer' : entier +*** 'string' : chaîne +*** 'pointer' : pointeur +*** 'buffer' : buffer +*** 'time' : heure + +Valeur en retour : + +* valeur de la propriété sous forme de chaîne + +Exemple en C : + +[source,C] +---------------------------------------- +const char *type_keys = weechat_hashtable_get_string (hashtable, "type_keys"); +---------------------------------------- + +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_hashtable_add_to_infolist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2991,6 +3181,9 @@ weechat_hashtable_add_to_infolist (hashtable, infolist_item, "testhash"); */ ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_hashtable_remove ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3017,6 +3210,9 @@ Exemple en C : weechat_hashtable_remove (hashtable, "ma_cle"); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_hashtable_remove_all ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3042,6 +3238,9 @@ Exemple en C : weechat_hashtable_remove_all (hashtable); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_hashtable_free ^^^^^^^^^^^^^^^^^^^^^^ @@ -3067,6 +3266,9 @@ Exemple en C : weechat_hashtable_free (hashtable); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + [[configuration_files]] Fichiers de configuration ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -3708,6 +3910,9 @@ else } ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_config_search_with_string ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3756,6 +3961,9 @@ else } ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_config_string_to_boolean ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -4134,6 +4342,9 @@ Exemple en C : char *description = weechat_config_option_get_pointer (option, "description"); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_config_option_is_null ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -4917,6 +5128,8 @@ Exemple en C : weechat_config_section_free (section); ---------------------------------------- +Script (Python) : + [source,python] ---------------------------------------- # prototype @@ -5408,6 +5621,9 @@ Exemple en C : weechat_printf_date (NULL, time (NULL) - 120, "Bonjour, il y a 2 minutes"); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_printf_tags ^^^^^^^^^^^^^^^^^^^ @@ -5436,6 +5652,9 @@ weechat_printf_tags (NULL, "notify_message", "Message avec une étiquette 'notify_message'"); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_printf_date_tags ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -6964,7 +7183,7 @@ weechat.hook_modifier_exec("mon_modifier", mes_donnees, ma_chaine) weechat_hook_info ^^^^^^^^^^^^^^^^^ -Accroche une information. +Accroche une information (le "callback" prend et retourne une chaîne). Prototype : @@ -7031,6 +7250,84 @@ hook = weechat.hook_info("mon_info", "Une information", "Info sur les paramètre "my_info_cb", "") ---------------------------------------- +weechat_hook_info_hashtable +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +_Nouveau dans la version 0.3.4._ + +Accroche une information (le "callback" prend et retourne une hashtable). + +Prototype : + +[source,C] +---------------------------------------- +struct t_hook *weechat_hook_info_hashtable (const char *info_name, + const char *description, + const char *args_description, + const char *output_description, + struct t_hashtable *(*callback)(void *data, + const char *info_name, + struct t_hashtable *hashtable), + void *callback_data); +---------------------------------------- + +Paramètres : + +* 'info_name' : nom de l'information + (priorité autorisée, voir la note sur la <<hook_priority,priorité>>) +* 'description' : description +* 'args_description' : description de la hashtable attendue + (optionnel, peut être NULL) +* 'output_description' : description de la hashtable retournée par le "callback" + (optionnel, peut être NULL) +* 'callback' : fonction appelée quand l'information est demandée, paramètres : +** 'void *data' : pointeur +** 'const char *info_name': nom de l'information +** 'struct t_hashtable *hashtable' : hashtable, dépendant de l'information +* 'callback_data' : pointeur donné au "callback" lorsqu'il est appelé par + WeeChat + +Valeur de retour : + +* pointeur vers le nouveau "hook", NULL en cas d'erreur + +Exemple en C : + +[source,C] +---------------------------------------- +struct t_hashtable * +my_info_hashtable_cb (void *data, const char *info_name, struct t_hashtable *hashtable) +{ + /* ... */ + return pointer_vers_nouvelle_hashtable; +} + +/* ajoute l'information "mon_info_hashtable" */ +struct t_hook *my_info_hook = weechat_hook_info_hashtable ("mon_info_hashtable", + "Une information", + "Info sur la hashtable en entrée", + "Info sur la hashtable en sortie", + &my_info_hashtable_cb, NULL); +---------------------------------------- + +Script (Python) : + +[source,python] +---------------------------------------- +# prototype +hook = weechat.hook_info_hashtable(info_name, description, args_description, + output_description, callback, callback_data) + +# exemple +def my_info_hashtable_cb(data, info_name, hashtable): + return { "test_cle": "test_valeur" } + +hook = weechat.hook_info_hashtable("mon_info_hashtable", "Une information", + "Info sur la hashtable en entrée", + "Info sur la hashtable en sortie", + "my_info_hashtable_cb", "") +---------------------------------------- + weechat_hook_infolist ^^^^^^^^^^^^^^^^^^^^^ @@ -7915,6 +8212,9 @@ my_close_cb (void *data, struct t_gui_buffer *buffer) weechat_buffer_set_pointer (mon_tampon, "close_callback", &my_close_cb); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_buffer_string_replace_local_var ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -9039,6 +9339,9 @@ else } ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_network_connect_to ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -9089,6 +9392,9 @@ else } ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + [[infos]] Infos ~~~~~ @@ -9098,7 +9404,7 @@ Fonctions pour obtenir des informations. weechat_info_get ^^^^^^^^^^^^^^^^ -Retourne une information de WeeChat ou d'une extension. +Retourne une information, sous forme de chaîne, de WeeChat ou d'une extension. Prototype : @@ -9142,6 +9448,75 @@ weechat.prnt("", "La version de WeeChat est : %s (compilée le %s)" weechat.prnt("", "Le répertoire de WeeChat est : %s" % weechat.info_get("weechat_dir", "")) ---------------------------------------- +weechat_info_get_hashtable +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +_Nouveau dans la version 0.3.4._ + +Retourne une information, sous forme de hashtable, de WeeChat ou d'une extension. + +Prototype: + +[source,C] +---------------------------------------- +struct t_hashtable *weechat_info_get_hashtable (const char *info_name, + struct t_hashtable *hashtable); +---------------------------------------- + +Paramètres : + +* 'info_name' : nom de l'information à lire : +include::autogen/plugin_api/infos_hashtable.txt[] +* 'hashtable' : hashtable avec les paramètres (dépendant de l'information + demandée) (optionnel, NULL si aucun paramètre n'est nécessaire) + +Valeur de retour : + +* hashtable avec l'information demandée, NULL en cas d'erreur + +Exemple en C : + +[source,C] +---------------------------------------- +struct t_hashtable *hashtable_in, *hashtable_out; + +hashtable_in = weechat_hashtable_new (8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); +if (hashtable_in) +{ + weechat_hashtable_set (hashtable_in, "message", + ":nick!user@host PRIVMSG #weechat :message ici"); + hashtable_out = weechat_info_get_hashtable ("irc_parse_message", + hashtable_in); + /* + * maintenant hashtable_out a les clés/valeurs suivantes : + * "nick" : "nick" + * "host" : "nick!user@host" + * "command" : "PRIVMSG" + * "channel" : "#weechat" + * "arguments": "#weechat :message ici" + */ + weechat_hashtable_free (hashtable_in); + weechat_hashtable_free (hashtable_out); +} +---------------------------------------- + +Script (Python): + +[source,python] +---------------------------------------- +# prototype +dict = weechat.info_get_hashtable(info_name, dict_in) + +# example +dict_in = { "message": ":nick!user@host PRIVMSG #weechat :message ici" } +weechat.prnt("", "message analysé: %s" + % weechat.info_get_hashtable("irc_parse_message", dict_in)) +---------------------------------------- + [[infolists]] Infolists ~~~~~~~~~ @@ -9404,6 +9779,9 @@ struct t_infolist_var *var = weechat_infolist_new_var_buffer (item, sizeof (buffer)); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_infolist_new_var_time ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -9834,6 +10212,9 @@ weechat_printf (NULL, "buffer = 0x%lx, taille = %d", pointer, size); ---------------------------------------- +[NOTE] +Cette fonction n'est pas disponible dans l'API script. + weechat_infolist_time ^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/fr/weechat_scripting.fr.txt b/doc/fr/weechat_scripting.fr.txt index 45fa4dc6b..354adf91e 100644 --- a/doc/fr/weechat_scripting.fr.txt +++ b/doc/fr/weechat_scripting.fr.txt @@ -281,7 +281,7 @@ Liste des fonctions de l'API script : hook_command, hook_command_run, hook_timer, hook_fd, hook_process, hook_connect, hook_print, hook_signal, hook_signal_send, hook_config, hook_completion, hook_completion_list_add, hook_modifier, hook_modifier_exec, - hook_info, hook_infolist, unhook, unhook_all + hook_info, hook_info_hashtable, hook_infolist, unhook, unhook_all | tampons | buffer_new, current_buffer, buffer_search, buffer_search_main, buffer_clear, buffer_close, buffer_merge, buffer_unmerge, buffer_get_integer, @@ -300,7 +300,7 @@ Liste des fonctions de l'API script : | commandes | command | infos | - info_get + info_get, info_get_hashtable | infolists | infolist_new, infolist_new_item, infolist_new_var_integer, infolist_new_var_string, infolist_new_var_pointer, infolist_new_var_time, + diff --git a/doc/fr/weechat_user.fr.txt b/doc/fr/weechat_user.fr.txt index 59bea103f..46001e1ab 100644 --- a/doc/fr/weechat_user.fr.txt +++ b/doc/fr/weechat_user.fr.txt @@ -100,7 +100,7 @@ compiler WeeChat. | python-dev | non | extension python | ruby1.8-dev | non | extension ruby | liblua5.1-0-dev | non | extension lua -| tcl-dev | non | extension tcl +| tcl-dev (>= 8.5) | non | extension tcl | asciidoc (>= 8.2) | non | construction de la documentation (fichiers HTML) | source-highlight | non | coloration des sources dans la documentation HTML |======================================== @@ -526,7 +526,7 @@ Touches pour la ligne de commande | Ctrl + R | Chercher du texte dans l'historique du tampon (deux appuis successifs pour - rechercher du texte exact), les occurences suivantes/précédentes peuvent être + rechercher du texte exact), les occurrences suivantes/précédentes peuvent être trouvées avec les flèches haut et bas + `/input search_text` diff --git a/doc/it/autogen/plugin_api/infos_hashtable.txt b/doc/it/autogen/plugin_api/infos_hashtable.txt new file mode 100644 index 000000000..0eb5c42cd --- /dev/null +++ b/doc/it/autogen/plugin_api/infos_hashtable.txt @@ -0,0 +1,7 @@ +[width="100%",cols="^1,^2,6,6,6",options="header"] +|======================================== +| Plugin | Nome | Descrizione | Hashtable (input) | Hashtable (output) + +| irc | irc_parse_message | parse an IRC message | "message": IRC message | "nick": nick, "host": host, "command": command, "channel": channel, "arguments": arguments (includes channel) + +|======================================== diff --git a/doc/it/weechat_plugin_api.it.txt b/doc/it/weechat_plugin_api.it.txt index 22489762c..875f301a3 100644 --- a/doc/it/weechat_plugin_api.it.txt +++ b/doc/it/weechat_plugin_api.it.txt @@ -521,6 +521,10 @@ char *str = weechat_strndup ("abcdef", 3); /* result: "abc" */ free (str); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_tolower ^^^^^^^^^^^^^^^^^^^^^^ @@ -545,6 +549,10 @@ char *str = "AbCdé"; weechat_string_tolower (str); /* str ora è: "abcdé" */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_toupper ^^^^^^^^^^^^^^^^^^^^^^ @@ -569,6 +577,10 @@ char *str = "AbCdé"; weechat_string_tolower (str); /* str ora è: "ABCDé" */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_strcasecmp ^^^^^^^^^^^^^^^^^^ @@ -601,6 +613,10 @@ Esempio in C: int diff = weechat_strcasecmp ("aaa", "CCC"); /* == -2 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_strncasecmp ^^^^^^^^^^^^^^^^^^^ @@ -634,6 +650,10 @@ Esempio in C: int diff = weechat_strncasecmp ("aabb", "aacc", 2); /* == 0 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_strcmp_ignore_chars ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -671,6 +691,10 @@ Esempio in C: int diff = weechat_strcmp_ignore_chars ("a-b", "--a-e", "-", 1); /* == -3 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_strcasestr ^^^^^^^^^^^^^^^^^^ @@ -700,6 +724,10 @@ Esempio in C: char *pos = weechat_strcasestr ("aBcDeF", "de"); /* risultato: puntatore a "DeF" */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_match ^^^^^^^^^^^^^^^^^^^^ @@ -780,6 +808,10 @@ char *str = weechat_string_replace ("test", "s", "x"); /* result: "text" */ free (str); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_expand_home ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -814,6 +846,10 @@ char *str = weechat_string_expand_home ("~/file.txt"); free (str); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_remove_quotes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -847,6 +883,10 @@ char *str = weechat_string_remove_quotes (string, " 'Non posso' ", "'"); free (str); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_strip ^^^^^^^^^^^^^^^^^^^^ @@ -880,6 +920,10 @@ char *str = weechat_string_strip (".abc -", 0, 1, "- ."); /* risultato: ".abc" * free (str); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_has_highlight ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1046,6 +1090,10 @@ argv = weechat_string_split (string, " ", 0, 0, &argc); weechat_string_free_split (argv); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_build_with_split_string ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1083,6 +1131,10 @@ char *str = weechat_string_build_with_split_string (argv, ";"); free (str); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_split_command ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1117,6 +1169,10 @@ char **argv = weechat_string_split_command ("/command1 arg;/command2", ';'); weechat_free_split_command (argv); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_free_split_command ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1143,6 +1199,10 @@ char **argv = weechat_string_split_command ("/command1 arg;/command2", ';'); weechat_free_split_command (argv); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_format_size ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1268,6 +1328,10 @@ weechat_string_encode_base64 (string, strlen (string), result); /* result == "YWJjZGVmZ2g=" */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_decode_base64 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1302,6 +1366,10 @@ length = weechat_string_decode_base64 (string, result); /* length == 8, result == "abcdefgh" */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_string_is_command_char ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1326,7 +1394,7 @@ Valore restituito: * 1 se il primo carattere della stringa è un comando carattere, altrimenti 0 -C examples: +Esempi in C: [source,C] ---------------------------------------- @@ -1341,7 +1409,7 @@ Script (Python): # prototype is_cmdchar = weechat.string_is_command_char(string) -# examples +# esempi command_char1 = weechat.string_is_command_char("/test") # == 1 command_char2 = weechat.string_is_command_char("test") # == 0 ---------------------------------------- @@ -1369,7 +1437,7 @@ Valore restituito: * puntatore all'interno di "string", oppure NULL -C examples: +Esempi in C: [source,C] ---------------------------------------- @@ -1385,7 +1453,7 @@ Script (Python): # prototype str = weechat.string_input_for_buffer(string) -# examples +# esempi str1 = weechat.string_input_for_buffer("test") # "test" str2 = weechat.string_input_for_buffer("/test") # "" str3 = weechat.string_input_for_buffer("//test") # "/test" @@ -1427,6 +1495,10 @@ if (weechat_utf8_has_8bits (string)) } ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_is_valid ^^^^^^^^^^^^^^^^^^^^^ @@ -1464,6 +1536,10 @@ else } ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_normalize ^^^^^^^^^^^^^^^^^^^^^^ @@ -1489,6 +1565,10 @@ Esempio in C: weechat_utf8_normalize (string, '?'); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_prev_char ^^^^^^^^^^^^^^^^^^^^^^ @@ -1519,6 +1599,10 @@ Esempio in C: char *prev_char = weechat_utf8_prev_char (string, ptr_in_string); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_next_char ^^^^^^^^^^^^^^^^^^^^^^ @@ -1547,6 +1631,10 @@ Esempio in C: char *next_char = weechat_utf8_next_char (string); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_char_int ^^^^^^^^^^^^^^^^^^^^^ @@ -1574,6 +1662,10 @@ Esempio in C: int char_int = weechat_utf8_char_int ("être"); /* "ê" come intero */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_char_size ^^^^^^^^^^^^^^^^^^^^^^ @@ -1601,6 +1693,10 @@ Esempio in C: int char_size = weechat_utf8_char_size ("être"); /* == 2 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_strlen ^^^^^^^^^^^^^^^^^^^ @@ -1628,6 +1724,10 @@ Esempio in C: int length = weechat_utf8_strlen ("chêne"); /* == 5 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_strnlen ^^^^^^^^^^^^^^^^^^^^ @@ -1657,6 +1757,10 @@ Esempio in C: int length = weechat_utf8_strnlen ("chêne", 4); /* == 3 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_strlen_screen ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1686,6 +1790,10 @@ Esempio in C: int length_on_screen = weechat_utf8_strlen_screen ("é"); /* == 1 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_charcmp ^^^^^^^^^^^^^^^^^^^^ @@ -1717,6 +1825,10 @@ Esempio in C: int diff = weechat_utf8_charcmp ("aaa", "ccc"); /* == -2 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_charcasecmp ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1748,6 +1860,10 @@ Esempio in C: int diff = weechat_utf8_charcasecmp ("aaa", "CCC"); /* == -2 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_char_size_screen ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1777,6 +1893,10 @@ Esempio in C: int length_on_screen = weechat_utf8_char_size_screen ("é"); /* == 1 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_add_offset ^^^^^^^^^^^^^^^^^^^^^^^ @@ -1806,6 +1926,10 @@ char *str = "chêne"; char *str2 = weechat_utf8_add_offset (str, 3); /* points to "ne" */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_real_pos ^^^^^^^^^^^^^^^^^^^^^ @@ -1834,6 +1958,10 @@ Esempio in C: int pos = weechat_utf8_real_pos ("chêne", 3); /* == 4 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_pos ^^^^^^^^^^^^^^^^ @@ -1862,6 +1990,10 @@ Esempio in C: int pos = weechat_utf8_pos ("chêne", 4); /* == 3 */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_utf8_strndup ^^^^^^^^^^^^^^^^^^^^ @@ -1892,6 +2024,10 @@ char *string = weechat_utf8_strndup ("chêne", 3); /* restituisce "chê" */ free (string); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + [[directories]] Cartelle ~~~~~~~~ @@ -2061,6 +2197,10 @@ void callback (void *data, const char *filename) weechat_exec_on_files ("/tmp", 0, NULL, &callback); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_file_get_content ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2095,6 +2235,10 @@ content = weechat_file_get_content ("/tmp/test.txt"); free (content); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + [[util]] Utilità ~~~~~~~ @@ -2134,6 +2278,10 @@ if (weechat_util_timeval_cmp (&tv1, &tv2) > 0) } ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_util_timeval_diff ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2162,6 +2310,10 @@ Esempio in C: long diff = weechat_util_timeval_diff (&tv1, &tv2); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_util_timeval_add ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2186,6 +2338,10 @@ Esempio in C: weechat_util_timeval_add (&tv, 2000); /* aggiunge 2 secondi */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_util_get_time_string ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2213,6 +2369,10 @@ weechat_printf (NULL, "date: %s", weechat_util_get_time_string (&date)); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + [[sorted_lists]] Elenchi ordinati ~~~~~~~~~~~~~~~~ @@ -2783,6 +2943,10 @@ struct t_hashtable *hashtable = weechat_hashtable_new (8, NULL); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_hashtable_set_with_size ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2822,6 +2986,10 @@ weechat_hashtable_set_with_size (hashtable, "my_key", 0, my_buffer, sizeof (my_buffer_struct)); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_hashtable_set ^^^^^^^^^^^^^^^^^^^^^ @@ -2884,6 +3052,10 @@ Esempio in C: void *value = weechat_hashtable_get (hashtable, "my_key"); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_hashtable_map ^^^^^^^^^^^^^^^^^^^^^ @@ -2926,6 +3098,10 @@ map_cb (void *data, struct t_hashtable *hashtable, weechat_hashtable_map (hashtable, &map_cb, NULL); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_hashtable_get_integer ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2959,6 +3135,58 @@ Esempio in C: int items_count = weechat_hashtable_get_integer (hashtable, "items_count"); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + +// TRANSLATION MISSING +weechat_hashtable_get_string +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +_Novità nella versione 0.3.4._ + +Return string value of a hashtable property. + +Prototype: + +[source,C] +---------------------------------------- +const char *weechat_hashtable_get_string (struct t_hashtable *hashtable, + void *property); +---------------------------------------- + +Arguments: + +* 'hashtable': hashtable pointer +* 'property': property name: +** 'type_keys': type for keys: +*** 'integer': integer +*** 'string': string +*** 'pointer': pointer +*** 'buffer': buffer +*** 'time': time +** 'type_values': type for values: +*** 'integer': integer +*** 'string': string +*** 'pointer': pointer +*** 'buffer': buffer +*** 'time': time + +Return value: + +* string value of property + +Esempio in C: + +[source,C] +---------------------------------------- +const char *type_keys = weechat_hashtable_get_string (hashtable, "type_keys"); +---------------------------------------- + +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_hashtable_add_to_infolist ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3002,6 +3230,10 @@ weechat_hashtable_add_to_infolist (hashtable, infolist_item, "testhash"); */ ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_hashtable_remove ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3028,6 +3260,10 @@ Esempio in C: weechat_hashtable_remove (hashtable, "my_key"); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_hashtable_remove_all ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3053,6 +3289,10 @@ Esempio in C: weechat_hashtable_remove_all (hashtable); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_hashtable_free ^^^^^^^^^^^^^^^^^^^^^^ @@ -3078,6 +3318,10 @@ Esempio in C: weechat_hashtable_free (hashtable); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + [[configuration_files]] File di configurazione ~~~~~~~~~~~~~~~~~~~~~~ @@ -3707,6 +3951,10 @@ else } ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_config_search_with_string ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3754,6 +4002,10 @@ else } ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_config_string_to_boolean ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -4132,6 +4384,10 @@ Esempio in C: char *description = weechat_config_option_get_pointer (option, "description"); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_config_option_is_null ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -5403,6 +5659,10 @@ Esempio in C: weechat_printf_date (NULL, time (NULL) - 120, "Ciao, 2 minuti fa"); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_printf_tags ^^^^^^^^^^^^^^^^^^^ @@ -5431,6 +5691,10 @@ weechat_printf_tags (NULL, "notify_message", "Messaggio con tag 'notify_message'"); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_printf_date_tags ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -5576,7 +5840,7 @@ removed from string). Default priority is 1000. -C example: +Esempio in C: [source,C] ---------------------------------------- @@ -6951,7 +7215,8 @@ weechat.hook_modifier_exec("my_modifier", my_data, my_string) weechat_hook_info ^^^^^^^^^^^^^^^^^ -Hook su una informazione. +// TRANSLATION MISSING +Hook su una informazione (callback takes and returns a string). Prototipo: @@ -7016,6 +7281,83 @@ hook = weechat.hook_info("my_info", "Some info", "Info about arguments", "my_info_cb", "") ---------------------------------------- +// TRANSLATION MISSING +weechat_hook_info_hashtable +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +_Novità nella versione 0.3.4._ + +Hook an information (callback takes and returns a hashtable). + +Prototype: + +[source,C] +---------------------------------------- +struct t_hook *weechat_hook_info_hashtable (const char *info_name, + const char *description, + const char *args_description, + const char *output_description, + struct t_hashtable *(*callback)(void *data, + const char *info_name, + struct t_hashtable *hashtable), + void *callback_data); +---------------------------------------- + +Arguments: + +* 'info_name': name of info + (priority allowed, see note about <<hook_priority,priority>>) +* 'description': description +* 'args_description': description of expected hashtable (optional, can be NULL) +* 'output_description': description of hashtable returned by callback + (optional, can be NULL) +* 'callback': function called when info is asked, arguments: +** 'void *data': pointer +** 'const char *info_name': name of info +** 'struct t_hashtable *hashtable': hashtable, depending on info +* 'callback_data': pointer given to callback when it is called by WeeChat + +Return value: + +* pointer to new hook, NULL if error occured + +Esempio in C: + +[source,C] +---------------------------------------- +struct t_hashtable * +my_info_hashtable_cb (void *data, const char *info_name, struct t_hashtable *hashtable) +{ + /* ... */ + return pointer_to_new_hashtable; +} + +/* add info "my_info_hashtable" */ +struct t_hook *my_info_hook = weechat_hook_info_hashtable ("my_info_hashtable", + "Some info", + "Info about input hashtable", + "Info about output hashtable", + &my_info_hashtable_cb, NULL); +---------------------------------------- + +Script (Python): + +[source,python] +---------------------------------------- +# prototype +hook = weechat.hook_info_hashtable(info_name, description, args_description, + output_description, callback, callback_data) + +# esempio +def my_info_hashtable_cb(data, info_name, hashtable): + return { "test_key": "test_value" } + +hook = weechat.hook_info_hashtable("my_info_hashtable", "Some info", + "Info about input hashtable", + "Info about output hashtable", + "my_info_hashtable_cb", "") +---------------------------------------- + weechat_hook_infolist ^^^^^^^^^^^^^^^^^^^^^ @@ -7898,6 +8240,10 @@ my_close_cb (void *data, struct t_gui_buffer *buffer) weechat_buffer_set_pointer (my_buffer, "close_callback", &my_close_cb); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_buffer_string_replace_local_var ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -9017,6 +9363,10 @@ else } ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_network_connect_to ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -9068,6 +9418,10 @@ else } ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + [[infos]] Info ~~~~ @@ -9077,7 +9431,8 @@ Funzioni per ottenere info. weechat_info_get ^^^^^^^^^^^^^^^^ -Restituisce informazioni da WeeChat o da un plugin. +// TRANSLATION MISSING +Return info, as string, from WeeChat or a plugin. Prototipo: @@ -9121,6 +9476,76 @@ weechat.prnt("", "Current WeeChat version is: %s (compiled on %s)" weechat.prnt("", "WeeChat home is: %s" % weechat.info_get("weechat_dir")) ---------------------------------------- +// TRANSLATION MISSING +weechat_info_get_hashtable +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +_Novità nella versione 0.3.4._ + +Return info, as hashtable, from WeeChat or a plugin. + +Prototype: + +[source,C] +---------------------------------------- +struct t_hashtable *weechat_info_get_hashtable (const char *info_name, + struct t_hashtable *hashtable); +---------------------------------------- + +Arguments: + +* 'info_name': name of info to read: +include::autogen/plugin_api/infos_hashtable.txt[] +* 'hashtable': hashtable with arguments (depends on info asked) (optional, NULL + if no argument is needed) + +Return value: + +* hashtable with info asked, NULL if an error occured + +Esempio in C: + +[source,C] +---------------------------------------- +struct t_hashtable *hashtable_in, *hashtable_out; + +hashtable_in = weechat_hashtable_new (8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); +if (hashtable_in) +{ + weechat_hashtable_set (hashtable_in, "message", + ":nick!user@host PRIVMSG #weechat :message here"); + hashtable_out = weechat_info_get_hashtable ("irc_parse_message", + hashtable_in); + /* + * now hashtable_out has following keys/values: + * "nick" : "nick" + * "host" : "nick!user@host" + * "command" : "PRIVMSG" + * "channel" : "#weechat" + * "arguments": "#weechat :message here" + */ + weechat_hashtable_free (hashtable_in); + weechat_hashtable_free (hashtable_out); +} +---------------------------------------- + +Script (Python): + +[source,python] +---------------------------------------- +# prototype +dict = weechat.info_get_hashtable(info_name, dict_in) + +# esempio +dict_in = { "message": ":nick!user@host PRIVMSG #weechat :message here" } +weechat.prnt("", "message parsed: %s" + % weechat.info_get_hashtable("irc_parse_message", dict_in)) +---------------------------------------- + [[infolists]] Liste info ~~~~~~~~~~ @@ -9385,6 +9810,10 @@ struct t_infolist_var *var = weechat_infolist_new_variable_buffer (item, sizeof (buffer)); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_infolist_new_var_time ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -9816,6 +10245,10 @@ weechat_printf (NULL, "buffer = 0x%lx, size = %d", pointer, size); ---------------------------------------- +[NOTE] +// TRANSLATION MISSING +This function is not available in scripting API. + weechat_infolist_time ^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/it/weechat_scripting.it.txt b/doc/it/weechat_scripting.it.txt index 75787e1da..62d51cb62 100644 --- a/doc/it/weechat_scripting.it.txt +++ b/doc/it/weechat_scripting.it.txt @@ -281,7 +281,7 @@ Elenco di funzioni nelle API per gli script: hook_command, hook_command_run, hook_timer, hook_fd, hook_process, hook_connect, hook_print, hook_signal, hook_signal_send, hook_config, hook_completion, hook_completion_list_add, hook_modifier, hook_modifier_exec, - hook_info, hook_infolist, unhook, unhook_all + hook_info, hook_info_hashtable, hook_infolist, unhook, unhook_all | buffer | buffer_new, current_buffer, buffer_search, buffer_search_main, buffer_clear, buffer_close, buffer_merge, buffer_unmerge, buffer_get_integer, @@ -300,7 +300,7 @@ Elenco di funzioni nelle API per gli script: | comandi | comando | info | - info_get + info_get, info_get_hashtable | liste info | infolist_new, infolist_new_item, infolist_new_var_integer, infolist_new_var_string, infolist_new_var_pointer, infolist_new_var_time, + diff --git a/doc/it/weechat_user.it.txt b/doc/it/weechat_user.it.txt index de0f9f339..5693a1db5 100644 --- a/doc/it/weechat_user.it.txt +++ b/doc/it/weechat_user.it.txt @@ -102,7 +102,7 @@ compilare WeeChat. | python-dev | no | plugin python | ruby1.8-dev | no | plugin ruby | liblua5.1-0-dev | no | plugin lua -| tcl-dev | no | plugin tcl +| tcl-dev (>= 8.5) | no | plugin tcl | asciidoc (>= 8.2) | no | compilazione della documentazione (file HTML) | source-highlight | no | evidenziazione della sintassi per i sorgenti nella documentazione HTML |======================================== @@ -525,7 +525,7 @@ Tasti per la riga di comando // TRANSLATION MISSING | Ctrl + R | Cerca il testo nella cronologia del buffer (due volte: cerca testo esatto), - next/previous occurences can be found with up and down arrows + + next/previous occurrences can be found with up and down arrows + `/input search_text` | Ctrl + T | @@ -20,14 +20,14 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.3.4-dev\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2010-08-14 12:23+0200\n" +"POT-Creation-Date: 2010-08-27 12:41+0200\n" "PO-Revision-Date: 2010-08-07 10:46+0200\n" "Last-Translator: Jiri Golembiovsky <golemj@gmail.com>\n" "Language-Team: weechat-dev <weechat-dev@nongnu.org>\n" +"Language: Czech\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Czech\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #. TRANSLATORS: "%s %s" after "compiled on" is date and time @@ -4835,6 +4835,20 @@ msgstr "server,funkce" msgid "value of feature, if supported by server (from IRC message 005)" msgstr "hodnota funkce, pokud je podporována serverem (z IRC zprávy 005)" +#, fuzzy +msgid "parse an IRC message" +msgstr "zpráva: zpráva, která se má poslat" + +#, fuzzy +msgid "\"message\": IRC message" +msgstr "zpráva: zpráva, která se má poslat" + +#. TRANSLATORS: please do not translate key names (enclosed by quotes) +msgid "" +"\"nick\": nick, \"host\": host, \"command\": command, \"channel\": channel, " +"\"arguments\": arguments (includes channel)" +msgstr "" + msgid "list of IRC servers" msgstr "seznam IRC serverů" @@ -5034,8 +5048,8 @@ msgstr[2] "minut" msgid "" "%s%s[%s%s%s]%s idle: %s%02d %s%s %s%02d %s%s %s%02d %s%s, signon at: %s%s" msgstr "" -"%s%s[%s%s%s]%s nečinný: %s%02d %s%s %s%02d %s%s %s%02d %s%s, přihlášen v: %s%" -"s" +"%s%s[%s%s%s]%s nečinný: %s%02d %s%s %s%02d %s%s %s%02d %s%s, přihlášen v: %s" +"%s" #, c-format msgid "%sMode %s%s %s[%s%s%s]" @@ -5839,8 +5853,8 @@ msgstr "%sMůžete smazat tento soubor, pokud je plugin \"%s\" starý/neplatný" #, c-format msgid "" -"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: \"%" -"s\"), failed to load" +"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: " +"\"%s\"), failed to load" msgstr "" "%sChyba: chyba API v pluginu \"%s\" (aktuální API: \"%s\", API pluginu: \"%s" "\"), načtení selhalo" @@ -5941,8 +5955,8 @@ msgstr "Klienti pro přenos:" #, c-format msgid "" -"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, %" -"lu sent" +"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, " +"%lu sent" msgstr "" "%3d. %s%s%s (%s%s%s), spuštěn v: %s, poslední aktivita: %s, bytů: %lu " "přijato, %lu odebráno" @@ -6586,8 +6600,8 @@ msgstr "Xfer seznam:" msgid "" "%3d. %s (%s), file: \"%s\" (local: \"%s\"), %s %s, status: %s%s%s (%lu %%)" msgstr "" -"%3d. %s (%s), soubor: \"%s\" (lokální: \"%s\"), %s %s, status: %s%s%s (%lu %" -"%)" +"%3d. %s (%s), soubor: \"%s\" (lokální: \"%s\"), %s %s, status: %s%s%s (%lu " +"%%)" #. TRANSLATORS: "%s" after "started on" is date #, c-format @@ -6600,8 +6614,8 @@ msgid "" " plugin: %s (id: %s), file: %lu bytes (position: %lu), address: %d.%d.%d." "%d (port %d)" msgstr "" -" plugin: %s (id: %s), soubor: %lu bytů (pozice: %lu), adresa: %d.%d.%d.%" -"d (port %d)" +" plugin: %s (id: %s), soubor: %lu bytů (pozice: %lu), adresa: %d.%d.%d." +"%d (port %d)" #. TRANSLATORS: "%s" after "started on" is date #, c-format @@ -6714,8 +6728,8 @@ msgstr "konvertovat mezery na podtržítka při odesílání souborů" msgid "rename incoming files if already exists (add \".1\", \".2\", ...)" msgstr "" -"přejmenovat příchozí soubory, jestliže již existují (přídat \".1\", \".2" -"\", ...)" +"přejmenovat příchozí soubory, jestliže již existují (přídat \".1\", " +"\".2\", ...)" msgid "" "automatically resume file transfer if connection with remote host is lost" @@ -6791,6 +6805,12 @@ msgstr "Popis" msgid "Arguments" msgstr "Argumenty" +msgid "Hashtable (input)" +msgstr "" + +msgid "Hashtable (output)" +msgstr "" + msgid "Pointer" msgstr "Ukazatel" @@ -22,14 +22,14 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.3.4-dev\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2010-08-14 12:23+0200\n" +"POT-Creation-Date: 2010-08-27 12:41+0200\n" "PO-Revision-Date: 2010-08-07 10:46+0200\n" "Last-Translator: Nils G. <weechatter@arcor.de>\n" "Language-Team: weechat-dev <weechat-dev@nongnu.org>\n" +"Language: German\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: German\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: KBabel 1.11.4\n" "X-Poedit-Bookmarks: -1,-1,180,-1,-1,-1,-1,-1,-1,-1\n" @@ -5033,6 +5033,20 @@ msgstr "" "Wert der Funktion, sofern es vom Server unterstützt wird (durch IRC Message " "005)" +#, fuzzy +msgid "parse an IRC message" +msgstr "Message: zu sendende Nachricht" + +#, fuzzy +msgid "\"message\": IRC message" +msgstr "Message: zu sendende Nachricht" + +#. TRANSLATORS: please do not translate key names (enclosed by quotes) +msgid "" +"\"nick\": nick, \"host\": host, \"command\": command, \"channel\": channel, " +"\"arguments\": arguments (includes channel)" +msgstr "" + msgid "list of IRC servers" msgstr "Liste der IRC-Server" @@ -5389,8 +5403,8 @@ msgstr "" #, c-format msgid "%s%s: nickname \"%s\" is unavailable, trying nickname #%d (\"%s\")" msgstr "" -"%s%s: Der Nickname \"%s\" ist nicht verfügbar. Versuche nun den Nicknamen #%" -"d (\"%s\")" +"%s%s: Der Nickname \"%s\" ist nicht verfügbar. Versuche nun den Nicknamen #" +"%d (\"%s\")" #, c-format msgid "%s%s: command \"%s\" not found:" @@ -6060,8 +6074,8 @@ msgstr "" #, c-format msgid "" -"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: \"%" -"s\"), failed to load" +"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: " +"\"%s\"), failed to load" msgstr "" "%sFehler: API Unverträglichkeit für Erweiterung \"%s\" (genutzte API: \"%s" "\", Erweiterungs-API: \"%s\"), Installation fehlgeschlagen" @@ -6164,8 +6178,8 @@ msgstr "Clients für Relay:" #, c-format msgid "" -"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, %" -"lu sent" +"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, " +"%lu sent" msgstr "" "%3d. %s%s%s (%s%s%s), gestartet am: %s, letzte Aktivität: %s, Bytes: %lu " "empfangen, %lu gesendet" @@ -6826,8 +6840,8 @@ msgstr "" #, c-format msgid "%3d. %s, chat with %s (local nick: %s), started on %s, status: %s%s" msgstr "" -"%3d. %s, Der Chat mit %s (lokaler Nick: %s), wurde am %s gestartet, Status: %" -"s%s" +"%3d. %s, Der Chat mit %s (lokaler Nick: %s), wurde am %s gestartet, Status: " +"%s%s" #, c-format msgid "" @@ -7031,6 +7045,12 @@ msgstr "Beschreibung" msgid "Arguments" msgstr "Argumente" +msgid "Hashtable (input)" +msgstr "" + +msgid "Hashtable (output)" +msgstr "" + msgid "Pointer" msgstr "Pointer" @@ -21,14 +21,14 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.3.4-dev\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2010-08-14 12:23+0200\n" +"POT-Creation-Date: 2010-08-27 12:41+0200\n" "PO-Revision-Date: 2010-08-07 10:46+0200\n" "Last-Translator: Elián Hanisch <lambdae2@gmail.com>\n" "Language-Team: weechat-dev <weechat-dev@nongnu.org>\n" +"Language: Spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Spanish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. TRANSLATORS: "%s %s" after "compiled on" is date and time @@ -4900,6 +4900,20 @@ msgstr "" "valor de la característica, si es soportada por el servidor (desde el " "mensaje IRC 005)" +#, fuzzy +msgid "parse an IRC message" +msgstr "mensaje: mensaje a enviar" + +#, fuzzy +msgid "\"message\": IRC message" +msgstr "mensaje: mensaje a enviar" + +#. TRANSLATORS: please do not translate key names (enclosed by quotes) +msgid "" +"\"nick\": nick, \"host\": host, \"command\": command, \"channel\": channel, " +"\"arguments\": arguments (includes channel)" +msgstr "" + msgid "list of IRC servers" msgstr "lista de servidores IRC" @@ -5914,8 +5928,8 @@ msgstr "%sSi el plugin \"%s\" es viejo/obsoleto, puedes borrar este archivo." #, c-format msgid "" -"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: \"%" -"s\"), failed to load" +"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: " +"\"%s\"), failed to load" msgstr "" "%sError: API del plugin \"%s\" es incompatible (API actual: \"%s\", API del " "plugin: \"%s\"), no se puede cargar" @@ -6019,8 +6033,8 @@ msgstr "Clientes para retransmitir:" #, c-format msgid "" -"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, %" -"lu sent" +"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, " +"%lu sent" msgstr "" "%3d. %s%s%s (%s%s%s), iniciado en: %s, última actividad: %s, bytes: %lu " "recibidos, %lu enviados" @@ -6687,8 +6701,8 @@ msgid "" " plugin: %s (id: %s), file: %lu bytes (position: %lu), address: %d.%d.%d." "%d (port %d)" msgstr "" -" plugin: %s (id: %s), archivo: %lu bytes (posición: %lu), dirección: %d.%" -"d.%d.%d (puerto %d)" +" plugin: %s (id: %s), archivo: %lu bytes (posición: %lu), dirección: %d." +"%d.%d.%d (puerto %d)" #. TRANSLATORS: "%s" after "started on" is date #, c-format @@ -6882,6 +6896,12 @@ msgstr "Descripción" msgid "Arguments" msgstr "Argumentos" +msgid "Hashtable (input)" +msgstr "" + +msgid "Hashtable (output)" +msgstr "" + msgid "Pointer" msgstr "Puntero" @@ -21,14 +21,14 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.3.4-dev\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2010-08-14 12:23+0200\n" -"PO-Revision-Date: 2010-08-14 12:25+0200\n" +"POT-Creation-Date: 2010-08-27 12:41+0200\n" +"PO-Revision-Date: 2010-08-20 15:30+0200\n" "Last-Translator: Sebastien Helleu <flashcode@flashtux.org>\n" "Language-Team: weechat-dev <weechat-dev@nongnu.org>\n" +"Language: French\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: French\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. TRANSLATORS: "%s %s" after "compiled on" is date and time @@ -955,8 +955,8 @@ msgstr "" " clear: efface le contenu du tampon (un numéro pour un tampon, -merged " "pour les tampons mélangés, -all pour tous les tampons, ou rien pour le " "tampon courant)\n" -" move: déplace le tampon dans la liste (peut être relatif, par exemple -" -"1)\n" +" move: déplace le tampon dans la liste (peut être relatif, par exemple " +"-1)\n" " merge: mélange le tampon courant avec un autre tampon (la zone de " "discussion sera un mélange des deux tampons)\n" " (par défaut ctrl-x bascule entre les tampons mélangés)\n" @@ -4947,6 +4947,20 @@ msgid "value of feature, if supported by server (from IRC message 005)" msgstr "" "valeur de la fonctionnalité, si supportée par le serveur (du message IRC 005)" +msgid "parse an IRC message" +msgstr "analyse un message IRC" + +msgid "\"message\": IRC message" +msgstr "\"message\": message IRC" + +#. TRANSLATORS: please do not translate key names (enclosed by quotes) +msgid "" +"\"nick\": nick, \"host\": host, \"command\": command, \"channel\": channel, " +"\"arguments\": arguments (includes channel)" +msgstr "" +"\"nick\": pseudo, \"host\": nom d'hôte, \"command\": commande, \"channel\": " +"canal, \"arguments\": paramètres (inclut le canal)" + msgid "list of IRC servers" msgstr "liste des serveurs IRC" @@ -5144,8 +5158,8 @@ msgstr[1] "minutes" msgid "" "%s%s[%s%s%s]%s idle: %s%02d %s%s %s%02d %s%s %s%02d %s%s, signon at: %s%s" msgstr "" -"%s%s[%s%s%s]%s inactivité: %s%02d %s%s %s%02d %s%s %s%02d %s%s, signé le: %s%" -"s" +"%s%s[%s%s%s]%s inactivité: %s%02d %s%s %s%02d %s%s %s%02d %s%s, signé le: %s" +"%s" #, c-format msgid "%sMode %s%s %s[%s%s%s]" @@ -5959,8 +5973,8 @@ msgstr "" #, c-format msgid "" -"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: \"%" -"s\"), failed to load" +"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: " +"\"%s\"), failed to load" msgstr "" "%sErreur: API non concordante pour l'extension \"%s\" (API courante: \"%s\", " "API extension: \"%s\"), échec de chargement" @@ -6064,8 +6078,8 @@ msgstr "Clients pour le relai:" #, c-format msgid "" -"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, %" -"lu sent" +"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, " +"%lu sent" msgstr "" "%3d. %s%s%s (%s%s%s), démarré le: %s, dernière activité: %s, octets: %lu " "reçus, %lu envoyés" @@ -6742,8 +6756,8 @@ msgid "" " plugin: %s (id: %s), file: %lu bytes (position: %lu), address: %d.%d.%d." "%d (port %d)" msgstr "" -" extension: %s (id: %s), fichier: %lu octets (position: %lu), addresse: %" -"d.%d.%d.%d (port %d)" +" extension: %s (id: %s), fichier: %lu octets (position: %lu), addresse: " +"%d.%d.%d.%d (port %d)" #. TRANSLATORS: "%s" after "started on" is date #, c-format @@ -6940,5 +6954,11 @@ msgstr "Description" msgid "Arguments" msgstr "Paramètres" +msgid "Hashtable (input)" +msgstr "Hashtable (entrée)" + +msgid "Hashtable (output)" +msgstr "Hashtable (sortie)" + msgid "Pointer" msgstr "Pointeur" @@ -20,14 +20,14 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.3.4-dev\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2010-08-14 12:23+0200\n" +"POT-Creation-Date: 2010-08-27 12:41+0200\n" "PO-Revision-Date: 2010-08-07 10:46+0200\n" "Last-Translator: Andras Voroskoi <voroskoi@frugalware.org>\n" "Language-Team: weechat-dev <weechat-dev@nongnu.org>\n" +"Language: Hungarian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Hungarian\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #. TRANSLATORS: "%s %s" after "compiled on" is date and time @@ -950,8 +950,8 @@ msgstr "" " close: puffer bezárása (esetleges argumentum egy kilépő üzenet szoba " "esetén)\n" " list: nyitott pufferek listája (paraméter hiányában is ez fut le)\n" -" notify: értesítési szint beállítása (0=soha, 1=highlight, 2=1+üzenet, 3=2" -"+ki/belépés)\n" +" notify: értesítési szint beállítása (0=soha, 1=highlight, 2=1+üzenet, " +"3=2+ki/belépés)\n" " (ha a szerver pufferben kerül lefuttatásra, akkor az egész " "szerverre állítja az értesítési szintet)\n" " scroll: puffertörténet görgetése (lehet relatív és végződhet betűvel: " @@ -4620,6 +4620,20 @@ msgid "value of feature, if supported by server (from IRC message 005)" msgstr "" #, fuzzy +msgid "parse an IRC message" +msgstr "üzenet: küldendő üzenet" + +#, fuzzy +msgid "\"message\": IRC message" +msgstr "üzenet: küldendő üzenet" + +#. TRANSLATORS: please do not translate key names (enclosed by quotes) +msgid "" +"\"nick\": nick, \"host\": host, \"command\": command, \"channel\": channel, " +"\"arguments\": arguments (includes channel)" +msgstr "" + +#, fuzzy msgid "list of IRC servers" msgstr "IRC szerver portja" @@ -5216,8 +5230,8 @@ msgstr "" #, fuzzy, c-format msgid "Connecting to server %s/%d%s%s via %s proxy %s/%d%s..." msgstr "" -"Csatlakozás a(z) %s:%d%s%s szerverhez %s proxy kiszolgálón keresztül: %s:%d%" -"s...\n" +"Csatlakozás a(z) %s:%d%s%s szerverhez %s proxy kiszolgálón keresztül: %s:%d" +"%s...\n" #, fuzzy, c-format msgid "%s: connecting to server %s/%d%s%s..." @@ -5576,8 +5590,8 @@ msgstr "" #, fuzzy, c-format msgid "" -"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: \"%" -"s\"), failed to load" +"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: " +"\"%s\"), failed to load" msgstr "" "%s a \"plugin_name\" szimbólum nem található a \"%s\" modulban, betöltés " "sikertelen\n" @@ -5685,8 +5699,8 @@ msgstr "" #, c-format msgid "" -"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, %" -"lu sent" +"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, " +"%lu sent" msgstr "" #, fuzzy, c-format @@ -6229,15 +6243,15 @@ msgstr "%s nincs elegendő memória új DCC számára\n" #, fuzzy, c-format msgid "%s: incoming file from %s (%d.%d.%d.%d): %s, %lu bytes (protocol: %s)" msgstr "" -"Beérkező DCC fájl a következőtől: %s%s%s (%s%d.%d.%d.%d%s)%s: %s%s%s, %s%lu%" -"s bájt\n" +"Beérkező DCC fájl a következőtől: %s%s%s (%s%d.%d.%d.%d%s)%s: %s%s%s, %s%lu" +"%s bájt\n" #, fuzzy, c-format msgid "" "%s: sending file to %s: %s (local filename: %s), %lu bytes (protocol: %s)" msgstr "" -"DCC fájl küldése a következőnek: %s%s%s: %s%s%s (helyi fájlnév: %s%s%s), %s%" -"lu%s bájt\n" +"DCC fájl küldése a következőnek: %s%s%s: %s%s%s (helyi fájlnév: %s%s%s), %s" +"%lu%s bájt\n" #, fuzzy, c-format msgid "%s: incoming chat request from %s (%d.%d.%d.%d)" @@ -6290,8 +6304,8 @@ msgid "" "%s%s: unable to resume file \"%s\" (port: %d, start position: %lu): xfer not " "found or not ready for transfer" msgstr "" -"%s nem sikerült a(z) \"%s\" fájlra visszatérni (port: %d, indulási pozíció: %" -"u): DCC nem található vagy véget ért\n" +"%s nem sikerült a(z) \"%s\" fájlra visszatérni (port: %d, indulási pozíció: " +"%u): DCC nem található vagy véget ért\n" #, fuzzy, c-format msgid "%s: file %s resumed at position %lu" @@ -6302,8 +6316,8 @@ msgid "" "%s%s: unable to accept resume file \"%s\" (port: %d, start position: %lu): " "xfer not found or not ready for transfer" msgstr "" -"%s nem sikerült a(z) \"%s\" fájlra visszatérni (port: %d, indulási pozíció: %" -"u): DCC nem található vagy véget ért\n" +"%s nem sikerült a(z) \"%s\" fájlra visszatérni (port: %d, indulási pozíció: " +"%u): DCC nem található vagy véget ért\n" #, fuzzy, c-format msgid "%s%s: aborting active xfer: \"%s\" from %s" @@ -6540,6 +6554,12 @@ msgstr " . leírás : %s\n" msgid "Arguments" msgstr "fogadó típusa [paraméterek]" +msgid "Hashtable (input)" +msgstr "" + +msgid "Hashtable (output)" +msgstr "" + #, fuzzy msgid "Pointer" msgstr "perc" @@ -20,14 +20,14 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.3.4-dev\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2010-08-14 12:23+0200\n" +"POT-Creation-Date: 2010-08-27 12:41+0200\n" "PO-Revision-Date: 2010-08-07 10:46+0200\n" "Last-Translator: Marco Paolone <marcopaolone@gmail.com>\n" "Language-Team: weechat-dev <weechat-dev@nongnu.org>\n" +"Language: Italian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Italian\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. TRANSLATORS: "%s %s" after "compiled on" is date and time @@ -4909,6 +4909,20 @@ msgid "value of feature, if supported by server (from IRC message 005)" msgstr "" "valore della caratteristica, se supportata dal servre (dal messaggio IRC 005)" +#, fuzzy +msgid "parse an IRC message" +msgstr "messaggio: messaggio da inviare" + +#, fuzzy +msgid "\"message\": IRC message" +msgstr "messaggio: messaggio da inviare" + +#. TRANSLATORS: please do not translate key names (enclosed by quotes) +msgid "" +"\"nick\": nick, \"host\": host, \"command\": command, \"channel\": channel, " +"\"arguments\": arguments (includes channel)" +msgstr "" + msgid "list of IRC servers" msgstr "elenco di server IRC" @@ -5106,8 +5120,8 @@ msgstr[1] "minuti" msgid "" "%s%s[%s%s%s]%s idle: %s%02d %s%s %s%02d %s%s %s%02d %s%s, signon at: %s%s" msgstr "" -"%s%s[%s%s%s]%s inattivo: %s%02d %s%s %s%02d %s%s %s%02d %s%s, connesso dal: %" -"s%s" +"%s%s[%s%s%s]%s inattivo: %s%02d %s%s %s%02d %s%s %s%02d %s%s, connesso dal: " +"%s%s" #, c-format msgid "%sMode %s%s %s[%s%s%s]" @@ -5917,8 +5931,8 @@ msgstr "" #, c-format msgid "" -"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: \"%" -"s\"), failed to load" +"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: " +"\"%s\"), failed to load" msgstr "" "%sErrore: API non corrispondente per il plugin \"%s\" (API corrente: \"%s\", " "API del plugin: \"%s\"), impossibile effettuare il caricamento" @@ -6022,8 +6036,8 @@ msgstr "Client per relay:" #, c-format msgid "" -"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, %" -"lu sent" +"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, " +"%lu sent" msgstr "" "%3d, %s%s%s (%s%s%s), avviato il %s, attività recente: %s byte: %lu " "ricevuti, %lu inviati" @@ -6632,8 +6646,8 @@ msgid "" "%s%s: unable to resume file \"%s\" (port: %d, start position: %lu): xfer not " "found or not ready for transfer" msgstr "" -"%s%s: impossibile riprendere il file \"%s\" (porta: %d, posizione di avvio: %" -"lu): xfer non trovato o non pronto per il trasferimento" +"%s%s: impossibile riprendere il file \"%s\" (porta: %d, posizione di avvio: " +"%lu): xfer non trovato o non pronto per il trasferimento" #, c-format msgid "%s: file %s resumed at position %lu" @@ -6682,8 +6696,8 @@ msgid "" " plugin: %s (id: %s), file: %lu bytes (position: %lu), address: %d.%d.%d." "%d (port %d)" msgstr "" -" plugin: %s (id: %s), file: %lu byte (posizione: %lu), indirizzo: %d.%d.%" -"d.%d (porta %d)" +" plugin: %s (id: %s), file: %lu byte (posizione: %lu), indirizzo: %d.%d." +"%d.%d (porta %d)" #. TRANSLATORS: "%s" after "started on" is date #, c-format @@ -6872,6 +6886,12 @@ msgstr "Descrizione" msgid "Arguments" msgstr "Argomenti" +msgid "Hashtable (input)" +msgstr "" + +msgid "Hashtable (output)" +msgstr "" + msgid "Pointer" msgstr "Puntatore" @@ -21,14 +21,14 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.3.4-dev\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2010-08-14 12:23+0200\n" +"POT-Creation-Date: 2010-08-27 12:41+0200\n" "PO-Revision-Date: 2010-08-07 10:46+0200\n" "Last-Translator: Krzysztof Koroscik <soltys@szluug.org>\n" "Language-Team: weechat-dev <weechat-dev@nongnu.org>\n" +"Language: Polish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Polish\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" @@ -750,8 +750,8 @@ msgstr[2] "dni" #, c-format msgid "WeeChat uptime: %s%d %s%s %s%02d%s:%s%02d%s:%s%02d%s, started on %s%s" msgstr "" -"Czas działania WeeChat: %s%d %s%s %s%02d%s:%s%02d%s:%s%02d%s, uruchomiono %s%" -"s" +"Czas działania WeeChat: %s%d %s%s %s%02d%s:%s%02d%s:%s%02d%s, uruchomiono %s" +"%s" msgid "compiled on" msgstr "skompilowano" @@ -4875,6 +4875,20 @@ msgstr "serwer,właściwość" msgid "value of feature, if supported by server (from IRC message 005)" msgstr "wartość opcji, jeśli jest wpierana przez serwer (z wiadomości IRC 005)" +#, fuzzy +msgid "parse an IRC message" +msgstr "wiadomość: wiadomość do wysłania" + +#, fuzzy +msgid "\"message\": IRC message" +msgstr "wiadomość: wiadomość do wysłania" + +#. TRANSLATORS: please do not translate key names (enclosed by quotes) +msgid "" +"\"nick\": nick, \"host\": host, \"command\": command, \"channel\": channel, " +"\"arguments\": arguments (includes channel)" +msgstr "" + msgid "list of IRC servers" msgstr "lista serwerów IRC" @@ -5862,8 +5876,8 @@ msgstr "" #, c-format msgid "" -"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: \"%" -"s\"), failed to load" +"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: " +"\"%s\"), failed to load" msgstr "" "%sBłąd: niedopasowane API \"%s\" (obecne API: \"%s\", API wtyczki: \"%s\"), " "nie udało się załadować" @@ -5966,8 +5980,8 @@ msgstr "Klienci do przekazania:" #, c-format msgid "" -"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, %" -"lu sent" +"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, " +"%lu sent" msgstr "" "%3d. %s%s%s (%s%s%s), rozpoczęto: %s,ostatnia aktywność: %s, bajtów: %lu " "odebrano, %lu wysłano" @@ -6439,8 +6453,8 @@ msgstr "%s: skryptów wyładowano" msgid "" "%s%s: unable to call function \"%s\", script is not initialized (script: %s)" msgstr "" -"%s%s: nie można wywołać funcji \"%s\", skrypt nie zainicjalizowany (skrypt: %" -"s)" +"%s%s: nie można wywołać funcji \"%s\", skrypt nie zainicjalizowany (skrypt: " +"%s)" #, c-format msgid "%s%s: wrong arguments for function \"%s\" (script: %s)" @@ -6621,8 +6635,8 @@ msgid "" " plugin: %s (id: %s), file: %lu bytes (position: %lu), address: %d.%d.%d." "%d (port %d)" msgstr "" -" wtyczka: %s (id: %s), plik: %lu bajtów (pozycja: %lu), adres: %d.%d.%d.%" -"d (port %d)" +" wtyczka: %s (id: %s), plik: %lu bajtów (pozycja: %lu), adres: %d.%d.%d." +"%d (port %d)" #. TRANSLATORS: "%s" after "started on" is date #, c-format @@ -6734,8 +6748,8 @@ msgstr "zamień spacje na podkreślenia wysyłając plik" msgid "rename incoming files if already exists (add \".1\", \".2\", ...)" msgstr "" -"zmień nazwę pliku przychodzącego jeśli juz istnieje (dodaj \".1\", \".2" -"\", ...)" +"zmień nazwę pliku przychodzącego jeśli juz istnieje (dodaj \".1\", " +"\".2\", ...)" msgid "" "automatically resume file transfer if connection with remote host is lost" @@ -6809,6 +6823,12 @@ msgstr "Opis" msgid "Arguments" msgstr "Argumenty" +msgid "Hashtable (input)" +msgstr "" + +msgid "Hashtable (output)" +msgstr "" + msgid "Pointer" msgstr "Wskaźnik" @@ -20,16 +20,16 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.3.4-dev\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2010-08-14 12:23+0200\n" +"POT-Creation-Date: 2010-08-27 12:41+0200\n" "PO-Revision-Date: 2010-08-07 10:46+0200\n" "Last-Translator: Pavel Shevchuk <stlwrt@gmail.com>\n" "Language-Team: weechat-dev <weechat-dev@nongnu.org>\n" +"Language: Russian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Russian\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" -"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Poedit-Bookmarks: -1,-1,608,-1,-1,-1,-1,-1,-1,-1\n" #. TRANSLATORS: "%s %s" after "compiled on" is date and time @@ -953,8 +953,8 @@ msgid "" " /buffer +1" msgstr "" "действие: выполняемое действие:\n" -" move: передвинуть буфер в списке (может быть относительным, например -" -"1)\n" +" move: передвинуть буфер в списке (может быть относительным, например " +"-1)\n" " close: закрыть буфер (необязательный аргумент - сообщение покидания " "канала)\n" " list: перечислить открытые буферы (отсутствие параметров подразумевает " @@ -4628,6 +4628,20 @@ msgid "value of feature, if supported by server (from IRC message 005)" msgstr "" #, fuzzy +msgid "parse an IRC message" +msgstr "сообщение: отправляемое сообщение" + +#, fuzzy +msgid "\"message\": IRC message" +msgstr "сообщение: отправляемое сообщение" + +#. TRANSLATORS: please do not translate key names (enclosed by quotes) +msgid "" +"\"nick\": nick, \"host\": host, \"command\": command, \"channel\": channel, " +"\"arguments\": arguments (includes channel)" +msgstr "" + +#, fuzzy msgid "list of IRC servers" msgstr "порт IRC сервера" @@ -5585,8 +5599,8 @@ msgstr "" #, fuzzy, c-format msgid "" -"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: \"%" -"s\"), failed to load" +"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: " +"\"%s\"), failed to load" msgstr "" "%s символ \"plugin_name\" не найден в plugin'е \"%s\", загрузка не удалась\n" @@ -5694,8 +5708,8 @@ msgstr "" #, c-format msgid "" -"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, %" -"lu sent" +"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, " +"%lu sent" msgstr "" #, fuzzy, c-format @@ -6543,6 +6557,12 @@ msgstr " . описание: %s\n" msgid "Arguments" msgstr "адресат тип [аргументы]" +msgid "Hashtable (input)" +msgstr "" + +msgid "Hashtable (output)" +msgstr "" + #, fuzzy msgid "Pointer" msgstr "минута" diff --git a/po/weechat.pot b/po/weechat.pot index 3374a5f89..3ea75a6d2 100644 --- a/po/weechat.pot +++ b/po/weechat.pot @@ -7,10 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2010-08-14 12:23+0200\n" +"POT-Creation-Date: 2010-08-27 12:41+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" @@ -3952,6 +3953,18 @@ msgstr "" msgid "value of feature, if supported by server (from IRC message 005)" msgstr "" +msgid "parse an IRC message" +msgstr "" + +msgid "\"message\": IRC message" +msgstr "" + +#. TRANSLATORS: please do not translate key names (enclosed by quotes) +msgid "" +"\"nick\": nick, \"host\": host, \"command\": command, \"channel\": channel, " +"\"arguments\": arguments (includes channel)" +msgstr "" + msgid "list of IRC servers" msgstr "" @@ -4848,8 +4861,8 @@ msgstr "" #, c-format msgid "" -"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: \"%" -"s\"), failed to load" +"%sError: API mismatch for plugin \"%s\" (current API: \"%s\", plugin API: " +"\"%s\"), failed to load" msgstr "" #, c-format @@ -4946,8 +4959,8 @@ msgstr "" #, c-format msgid "" -"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, %" -"lu sent" +"%3d. %s%s%s (%s%s%s), started on: %s, last activity: %s, bytes: %lu recv, " +"%lu sent" msgstr "" #, c-format @@ -5723,5 +5736,11 @@ msgstr "" msgid "Arguments" msgstr "" +msgid "Hashtable (input)" +msgstr "" + +msgid "Hashtable (output)" +msgstr "" + msgid "Pointer" msgstr "" diff --git a/src/core/wee-hashtable.c b/src/core/wee-hashtable.c index bc44f1c13..0f4d91601 100644 --- a/src/core/wee-hashtable.c +++ b/src/core/wee-hashtable.c @@ -38,7 +38,9 @@ char *hashtable_type_string[HASHTABLE_NUM_TYPES] = -{ "integer", "string", "pointer", "buffer", "time" }; +{ WEECHAT_HASHTABLE_INTEGER, WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_POINTER, WEECHAT_HASHTABLE_BUFFER, + WEECHAT_HASHTABLE_TIME }; /* @@ -403,6 +405,24 @@ hashtable_get_integer (struct t_hashtable *hashtable, const char *property) } /* + * hashtable_get_string: get a hashtable property as string + */ + +const char * +hashtable_get_string (struct t_hashtable *hashtable, const char *property) +{ + if (hashtable && property) + { + if (string_strcasecmp (property, "type_keys") == 0) + return hashtable_type_string[hashtable->type_keys]; + else if (string_strcasecmp (property, "type_values") == 0) + return hashtable_type_string[hashtable->type_values]; + } + + return NULL; +} + +/* * hashtable_add_to_infolist: add hashtable keys and values to infolist * return 1 if ok, 0 if error */ diff --git a/src/core/wee-hashtable.h b/src/core/wee-hashtable.h index 33dc7c11c..ab901528b 100644 --- a/src/core/wee-hashtable.h +++ b/src/core/wee-hashtable.h @@ -115,6 +115,8 @@ extern void hashtable_map (struct t_hashtable *hashtable, void *callback_map_data); extern int hashtable_get_integer (struct t_hashtable *hashtable, const char *property); +extern const char *hashtable_get_string (struct t_hashtable *hashtable, + const char *property); extern int hashtable_add_to_infolist (struct t_hashtable *hashtable, struct t_infolist_item *infolist_item, const char *prefix); diff --git a/src/core/wee-hook.c b/src/core/wee-hook.c index d5e26b6fb..d49732ff4 100644 --- a/src/core/wee-hook.c +++ b/src/core/wee-hook.c @@ -36,6 +36,7 @@ #include "weechat.h" #include "wee-hook.h" +#include "wee-hashtable.h" #include "wee-infolist.h" #include "wee-list.h" #include "wee-log.h" @@ -52,7 +53,8 @@ char *hook_type_string[HOOK_NUM_TYPES] = { "command", "command_run", "timer", "fd", "process", "connect", "print", - "signal", "config", "completion", "modifier", "info", "infolist" }; + "signal", "config", "completion", "modifier", "info", "info_hashtable", + "infolist" }; struct t_hook *weechat_hooks[HOOK_NUM_TYPES]; /* list of hooks */ struct t_hook *last_weechat_hook[HOOK_NUM_TYPES]; /* last hook */ int hook_exec_recursion = 0; /* 1 when a hook is executed */ @@ -2188,7 +2190,7 @@ hook_info (struct t_weechat_plugin *plugin, const char *info_name, } /* - * hook_info_get: get info via info hook + * hook_info_get: get info (as string) via info hook */ const char * @@ -2235,6 +2237,101 @@ hook_info_get (struct t_weechat_plugin *plugin, const char *info_name, } /* + * hook_info_hashtable: hook an info using hashtable + */ + +struct t_hook * +hook_info_hashtable (struct t_weechat_plugin *plugin, const char *info_name, + const char *description, const char *args_description, + const char *output_description, + t_hook_callback_info_hashtable *callback, + void *callback_data) +{ + struct t_hook *new_hook; + struct t_hook_info_hashtable *new_hook_info_hashtable; + int priority; + const char *ptr_info_name; + + if (!info_name || !info_name[0] || !callback) + return NULL; + + new_hook = malloc (sizeof (*new_hook)); + if (!new_hook) + return NULL; + new_hook_info_hashtable = malloc (sizeof (*new_hook_info_hashtable)); + if (!new_hook_info_hashtable) + { + free (new_hook); + return NULL; + } + + hook_get_priority_and_name (info_name, &priority, &ptr_info_name); + hook_init_data (new_hook, plugin, HOOK_TYPE_INFO_HASHTABLE, priority, + callback_data); + + new_hook->hook_data = new_hook_info_hashtable; + new_hook_info_hashtable->callback = callback; + new_hook_info_hashtable->info_name = strdup ((ptr_info_name) ? + ptr_info_name : info_name); + new_hook_info_hashtable->description = strdup ((description) ? description : ""); + new_hook_info_hashtable->args_description = strdup ((args_description) ? + args_description : ""); + new_hook_info_hashtable->output_description = strdup ((output_description) ? + output_description : ""); + + hook_add_to_list (new_hook); + + return new_hook; +} + +/* + * hook_info_get_hashtable: get info (as hashtable) via info hook + */ + +struct t_hashtable * +hook_info_get_hashtable (struct t_weechat_plugin *plugin, const char *info_name, + struct t_hashtable *hashtable) +{ + struct t_hook *ptr_hook, *next_hook; + struct t_hashtable *value; + + /* make C compiler happy */ + (void) plugin; + + if (!info_name || !info_name[0]) + return NULL; + + hook_exec_start (); + + ptr_hook = weechat_hooks[HOOK_TYPE_INFO_HASHTABLE]; + while (ptr_hook) + { + next_hook = ptr_hook->next_hook; + + if (!ptr_hook->deleted + && !ptr_hook->running + && (string_strcasecmp (HOOK_INFO_HASHTABLE(ptr_hook, info_name), + info_name) == 0)) + { + ptr_hook->running = 1; + value = (HOOK_INFO_HASHTABLE(ptr_hook, callback)) + (ptr_hook->callback_data, info_name, hashtable); + ptr_hook->running = 0; + + hook_exec_end (); + return value; + } + + ptr_hook = next_hook; + } + + hook_exec_end (); + + /* info not found */ + return NULL; +} + +/* * hook_infolist: hook an infolist */ @@ -2478,6 +2575,16 @@ unhook (struct t_hook *hook) if (HOOK_INFO(hook, args_description)) free (HOOK_INFO(hook, args_description)); break; + case HOOK_TYPE_INFO_HASHTABLE: + if (HOOK_INFO_HASHTABLE(hook, info_name)) + free (HOOK_INFO_HASHTABLE(hook, info_name)); + if (HOOK_INFO_HASHTABLE(hook, description)) + free (HOOK_INFO_HASHTABLE(hook, description)); + if (HOOK_INFO_HASHTABLE(hook, args_description)) + free (HOOK_INFO_HASHTABLE(hook, args_description)); + if (HOOK_INFO_HASHTABLE(hook, output_description)) + free (HOOK_INFO_HASHTABLE(hook, output_description)); + break; case HOOK_TYPE_INFOLIST: if (HOOK_INFOLIST(hook, infolist_name)) free (HOOK_INFOLIST(hook, infolist_name)); @@ -2815,6 +2922,36 @@ hook_add_to_infolist_type (struct t_infolist *infolist, return 0; } break; + case HOOK_TYPE_INFO_HASHTABLE: + if (!ptr_hook->deleted) + { + if (!infolist_new_var_pointer (ptr_item, "callback", HOOK_INFO_HASHTABLE(ptr_hook, callback))) + return 0; + if (!infolist_new_var_string (ptr_item, "info_name", HOOK_INFO_HASHTABLE(ptr_hook, info_name))) + return 0; + if (!infolist_new_var_string (ptr_item, "description", HOOK_INFO_HASHTABLE(ptr_hook, description))) + return 0; + if (!infolist_new_var_string (ptr_item, "description_nls", + (HOOK_INFO_HASHTABLE(ptr_hook, description) + && HOOK_INFO_HASHTABLE(ptr_hook, description)[0]) ? + _(HOOK_INFO_HASHTABLE(ptr_hook, description)) : "")) + return 0; + if (!infolist_new_var_string (ptr_item, "args_description", HOOK_INFO_HASHTABLE(ptr_hook, args_description))) + return 0; + if (!infolist_new_var_string (ptr_item, "args_description_nls", + (HOOK_INFO_HASHTABLE(ptr_hook, args_description) + && HOOK_INFO_HASHTABLE(ptr_hook, args_description)[0]) ? + _(HOOK_INFO_HASHTABLE(ptr_hook, args_description)) : "")) + return 0; + if (!infolist_new_var_string (ptr_item, "output_description", HOOK_INFO_HASHTABLE(ptr_hook, output_description))) + return 0; + if (!infolist_new_var_string (ptr_item, "output_description_nls", + (HOOK_INFO_HASHTABLE(ptr_hook, output_description) + && HOOK_INFO_HASHTABLE(ptr_hook, output_description)[0]) ? + _(HOOK_INFO_HASHTABLE(ptr_hook, output_description)) : "")) + return 0; + } + break; case HOOK_TYPE_INFOLIST: if (!ptr_hook->deleted) { @@ -3079,6 +3216,17 @@ hook_print_log () log_printf (" args_description. . . : '%s'", HOOK_INFO(ptr_hook, args_description)); } break; + case HOOK_TYPE_INFO_HASHTABLE: + if (!ptr_hook->deleted) + { + log_printf (" info_hashtable data:"); + log_printf (" callback. . . . . . . : 0x%lx", HOOK_INFO_HASHTABLE(ptr_hook, callback)); + log_printf (" info_name . . . . . . : '%s'", HOOK_INFO_HASHTABLE(ptr_hook, info_name)); + log_printf (" description . . . . . : '%s'", HOOK_INFO_HASHTABLE(ptr_hook, description)); + log_printf (" args_description. . . : '%s'", HOOK_INFO_HASHTABLE(ptr_hook, args_description)); + log_printf (" output_description. . : '%s'", HOOK_INFO_HASHTABLE(ptr_hook, output_description)); + } + break; case HOOK_TYPE_INFOLIST: if (!ptr_hook->deleted) { diff --git a/src/core/wee-hook.h b/src/core/wee-hook.h index 7a10b8ad3..2e2b735d6 100644 --- a/src/core/wee-hook.h +++ b/src/core/wee-hook.h @@ -28,6 +28,7 @@ struct t_gui_buffer; struct t_gui_line; struct t_gui_completion; struct t_weelist; +struct t_hashtable; struct t_infolist; /* hook types */ @@ -46,6 +47,7 @@ enum t_hook_type HOOK_TYPE_COMPLETION, /* custom completions */ HOOK_TYPE_MODIFIER, /* string modifier */ HOOK_TYPE_INFO, /* get some info as string */ + HOOK_TYPE_INFO_HASHTABLE, /* get some info as hashtable */ HOOK_TYPE_INFOLIST, /* get some info as infolist */ /* number of hook types */ HOOK_NUM_TYPES, @@ -78,6 +80,7 @@ enum t_hook_type #define HOOK_COMPLETION(hook, var) (((struct t_hook_completion *)hook->hook_data)->var) #define HOOK_MODIFIER(hook, var) (((struct t_hook_modifier *)hook->hook_data)->var) #define HOOK_INFO(hook, var) (((struct t_hook_info *)hook->hook_data)->var) +#define HOOK_INFO_HASHTABLE(hook, var) (((struct t_hook_info_hashtable *)hook->hook_data)->var) #define HOOK_INFOLIST(hook, var) (((struct t_hook_infolist *)hook->hook_data)->var) struct t_hook @@ -300,6 +303,21 @@ struct t_hook_info char *args_description; /* description of arguments */ }; +/* hook info (hashtable) */ + +typedef struct t_hashtable *(t_hook_callback_info_hashtable)(void *data, + const char *info_name, + struct t_hashtable *hashtable); + +struct t_hook_info_hashtable +{ + t_hook_callback_info_hashtable *callback; /* info_hashtable callback */ + char *info_name; /* name of info returned */ + char *description; /* description */ + char *args_description; /* description of arguments */ + char *output_description; /* description of output (hashtable) */ +}; + /* hook infolist */ typedef struct t_infolist *(t_hook_callback_infolist)(void *data, @@ -425,6 +443,16 @@ extern struct t_hook *hook_info (struct t_weechat_plugin *plugin, extern const char *hook_info_get (struct t_weechat_plugin *plugin, const char *info_name, const char *arguments); +extern struct t_hook *hook_info_hashtable (struct t_weechat_plugin *plugin, + const char *info_name, + const char *description, + const char *args_description, + const char *output_description, + t_hook_callback_info_hashtable *callback, + void *callback_data); +extern struct t_hashtable *hook_info_get_hashtable (struct t_weechat_plugin *plugin, + const char *info_name, + struct t_hashtable *hashtable); extern struct t_hook *hook_infolist (struct t_weechat_plugin *plugin, const char *infolist_name, const char *description, diff --git a/src/core/wee-string.c b/src/core/wee-string.c index 8e3fdb66b..da30195f4 100644 --- a/src/core/wee-string.c +++ b/src/core/wee-string.c @@ -377,7 +377,7 @@ string_replace (const char *string, const char *search, const char *replace) if (!new_string) return strdup (string); - /* replace all occurences */ + /* replace all occurrences */ new_string[0] = '\0'; while (string && string[0]) { diff --git a/src/plugins/irc/irc-info.c b/src/plugins/irc/irc-info.c index 4f1602e1a..3a6c8849a 100644 --- a/src/plugins/irc/irc-info.c +++ b/src/plugins/irc/irc-info.c @@ -229,6 +229,38 @@ irc_info_get_info_cb (void *data, const char *info_name, } /* + * irc_info_get_info_hashtable_cb: callback called when IRC info_hashtable is + * asked + */ + +struct t_hashtable * +irc_info_get_info_hashtable_cb (void *data, const char *info_name, + struct t_hashtable *hashtable) +{ + const char *message; + struct t_hashtable *value; + + /* make C compiler happy */ + (void) data; + + if (weechat_strcasecmp (info_name, "irc_parse_message") == 0) + { + if (hashtable) + { + message = (const char *)weechat_hashtable_get (hashtable, + "message"); + if (message) + { + value = irc_server_parse_message_to_hashtable (message); + return value; + } + } + } + + return NULL; +} + +/* * irc_info_get_infolist_cb: callback called when IRC infolist is asked */ @@ -448,48 +480,71 @@ void irc_info_init () { /* info hooks */ - weechat_hook_info ("irc_is_channel", N_("1 if string is a valid IRC channel name"), + weechat_hook_info ("irc_is_channel", + N_("1 if string is a valid IRC channel name"), N_("channel name"), &irc_info_get_info_cb, NULL); - weechat_hook_info ("irc_is_nick", N_("1 if string is a valid IRC nick name"), + weechat_hook_info ("irc_is_nick", + N_("1 if string is a valid IRC nick name"), N_("nickname"), &irc_info_get_info_cb, NULL); - weechat_hook_info ("irc_nick", N_("get current nick on a server"), + weechat_hook_info ("irc_nick", + N_("get current nick on a server"), N_("server name"), &irc_info_get_info_cb, NULL); - weechat_hook_info ("irc_nick_from_host", N_("get nick from IRC host"), + weechat_hook_info ("irc_nick_from_host", + N_("get nick from IRC host"), N_("IRC host (like `:nick!name@server.com`)"), &irc_info_get_info_cb, NULL); - weechat_hook_info ("irc_nick_color", N_("get nick color code"), + weechat_hook_info ("irc_nick_color", + N_("get nick color code"), N_("nickname"), &irc_info_get_info_cb, NULL); - weechat_hook_info ("irc_nick_color_name", N_("get nick color name"), + weechat_hook_info ("irc_nick_color_name", + N_("get nick color name"), N_("nickname"), &irc_info_get_info_cb, NULL); - weechat_hook_info ("irc_buffer", N_("get buffer pointer for an IRC server/channel/nick"), + weechat_hook_info ("irc_buffer", + N_("get buffer pointer for an IRC server/channel/nick"), N_("server,channel,nick (channel and nicks are optional)"), &irc_info_get_info_cb, NULL); - weechat_hook_info ("irc_server_isupport", N_("1 if server supports this feature (from IRC message 005)"), + weechat_hook_info ("irc_server_isupport", + N_("1 if server supports this feature (from IRC message 005)"), N_("server,feature"), &irc_info_get_info_cb, NULL); - weechat_hook_info ("irc_server_isupport_value", N_("value of feature, if supported by server (from IRC message 005)"), + weechat_hook_info ("irc_server_isupport_value", + N_("value of feature, if supported by server (from IRC message 005)"), N_("server,feature"), &irc_info_get_info_cb, NULL); + /* info_hashtable hooks */ + weechat_hook_info_hashtable ("irc_parse_message", + N_("parse an IRC message"), + N_("\"message\": IRC message"), + /* TRANSLATORS: please do not translate key names (enclosed by quotes) */ + N_("\"nick\": nick, \"host\": host, " + "\"command\": command, \"channel\": channel, " + "\"arguments\": arguments (includes channel)"), + &irc_info_get_info_hashtable_cb, NULL); + /* infolist hooks */ - weechat_hook_infolist ("irc_server", N_("list of IRC servers"), + weechat_hook_infolist ("irc_server", + N_("list of IRC servers"), N_("server pointer (optional)"), N_("server name (can start or end with \"*\" as wildcard) (optional)"), &irc_info_get_infolist_cb, NULL); - weechat_hook_infolist ("irc_channel", N_("list of channels for an IRC server"), + weechat_hook_infolist ("irc_channel", + N_("list of channels for an IRC server"), N_("channel pointer (optional)"), N_("server name"), &irc_info_get_infolist_cb, NULL); - weechat_hook_infolist ("irc_nick", N_("list of nicks for an IRC channel"), + weechat_hook_infolist ("irc_nick", + N_("list of nicks for an IRC channel"), N_("nick pointer (optional)"), N_("server,channel,nick (channel and nick are optional)"), &irc_info_get_infolist_cb, NULL); - weechat_hook_infolist ("irc_ignore", N_("list of IRC ignores"), + weechat_hook_infolist ("irc_ignore", + N_("list of IRC ignores"), N_("ignore pointer (optional)"), NULL, &irc_info_get_infolist_cb, NULL); diff --git a/src/plugins/irc/irc-server.c b/src/plugins/irc/irc-server.c index 75b117902..9c6322b31 100644 --- a/src/plugins/irc/irc-server.c +++ b/src/plugins/irc/irc-server.c @@ -1215,6 +1215,9 @@ irc_server_parse_message (const char *message, char **nick, char **host, if (arguments) *arguments = NULL; + if (!message) + return; + /* * we will use this message as example: * :FlashCode!n=FlashCod@host.com PRIVMSG #channel :hello! @@ -1324,6 +1327,46 @@ irc_server_parse_message (const char *message, char **nick, char **host, } /* + * irc_server_parse_message_to_hashtable: parse IRC message and return hashtable + * with keys: nick, host, command, + * channel, arguments + * Note: hashtable has to be free() + * after use + */ + +struct t_hashtable * +irc_server_parse_message_to_hashtable (const char *message) +{ + char *nick, *host, *command, *channel, *arguments; + char empty_str[1] = { '\0' }; + struct t_hashtable *hashtable; + + irc_server_parse_message (message, &nick, &host, &command, &channel, + &arguments); + + hashtable = weechat_hashtable_new (8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + if (!hashtable) + return NULL; + + weechat_hashtable_set (hashtable, "nick", + (nick) ? (void *)nick : (void *)empty_str); + weechat_hashtable_set (hashtable, "host", + (host) ? (void *)host : (void *)empty_str); + weechat_hashtable_set (hashtable, "command", + (command) ? (void *)command : (void *)empty_str); + weechat_hashtable_set (hashtable, "channel", + (channel) ? (void *)channel : (void *)empty_str); + weechat_hashtable_set (hashtable, "arguments", + (arguments) ? (void *)arguments : (void *)empty_str); + + return hashtable; +} + +/* * irc_server_send_one_msg: send one message to IRC server * if queue_msg > 0, then messages are in a queue and * sent slowly (to be sure there will not be any diff --git a/src/plugins/irc/irc-server.h b/src/plugins/irc/irc-server.h index 8ca2615f8..02e6a8134 100644 --- a/src/plugins/irc/irc-server.h +++ b/src/plugins/irc/irc-server.h @@ -203,6 +203,7 @@ extern int irc_server_rename (struct t_irc_server *server, const char *new_name) extern void irc_server_send_signal (struct t_irc_server *server, const char *signal, const char *command, const char *full_message); +extern struct t_hashtable *irc_server_parse_message_to_hashtable (const char *message); extern void irc_server_sendf (struct t_irc_server *server, int queue_msg, const char *format, ...); extern struct t_irc_server *irc_server_search (const char *server_name); diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index 5317e4f14..a66769b7a 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -527,6 +527,7 @@ plugin_load (const char *filename) new_plugin->hashtable_get = &hashtable_get; new_plugin->hashtable_map = &hashtable_map; new_plugin->hashtable_get_integer = &hashtable_get_integer; + new_plugin->hashtable_get_string = &hashtable_get_string; new_plugin->hashtable_add_to_infolist = &hashtable_add_to_infolist; new_plugin->hashtable_remove = &hashtable_remove; new_plugin->hashtable_remove_all = &hashtable_remove_all; @@ -592,6 +593,7 @@ plugin_load (const char *filename) new_plugin->hook_modifier = &hook_modifier; new_plugin->hook_modifier_exec = &hook_modifier_exec; new_plugin->hook_info = &hook_info; + new_plugin->hook_info_hashtable = &hook_info_hashtable; new_plugin->hook_infolist = &hook_infolist; new_plugin->unhook = &unhook; new_plugin->unhook_all = &unhook_all_plugin; @@ -639,6 +641,7 @@ plugin_load (const char *filename) new_plugin->network_connect_to = &network_connect_to; new_plugin->info_get = &hook_info_get; + new_plugin->info_get_hashtable = &hook_info_get_hashtable; new_plugin->infolist_new = &infolist_new; new_plugin->infolist_new_item = &infolist_new_item; diff --git a/src/plugins/scripts/lua/weechat-lua-api.c b/src/plugins/scripts/lua/weechat-lua-api.c index 7a5de5bd7..1c38cc2c7 100644 --- a/src/plugins/scripts/lua/weechat-lua-api.c +++ b/src/plugins/scripts/lua/weechat-lua-api.c @@ -1218,7 +1218,8 @@ weechat_lua_api_config_reload_cb (void *data, struct t_config_file *config_file) { struct t_script_callback *script_callback; - char *lua_argv[3], empty_arg[1] = { '\0' }; + void *lua_argv[2]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1232,7 +1233,7 @@ weechat_lua_api_config_reload_cb (void *data, rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "ss", lua_argv); if (!rc) ret = WEECHAT_CONFIG_READ_FILE_NOT_FOUND; @@ -1307,7 +1308,8 @@ weechat_lua_api_config_read_cb (void *data, const char *option_name, const char *value) { struct t_script_callback *script_callback; - char *lua_argv[6], empty_arg[1] = { '\0' }; + void *lua_argv[5]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1319,12 +1321,11 @@ weechat_lua_api_config_read_cb (void *data, lua_argv[2] = script_ptr2str (section); lua_argv[3] = (option_name) ? (char *)option_name : empty_arg; lua_argv[4] = (value) ? (char *)value : empty_arg; - lua_argv[5] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sssss", lua_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_SET_ERROR; @@ -1354,7 +1355,8 @@ weechat_lua_api_config_section_write_cb (void *data, const char *section_name) { struct t_script_callback *script_callback; - char *lua_argv[4], empty_arg[1] = { '\0' }; + void *lua_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1364,12 +1366,11 @@ weechat_lua_api_config_section_write_cb (void *data, lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = script_ptr2str (config_file); lua_argv[2] = (section_name) ? (char *)section_name : empty_arg; - lua_argv[3] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sss", lua_argv); if (!rc) ret = WEECHAT_CONFIG_WRITE_ERROR; @@ -1398,7 +1399,8 @@ weechat_lua_api_config_section_write_default_cb (void *data, const char *section_name) { struct t_script_callback *script_callback; - char *lua_argv[4], empty_arg[1] = { '\0' }; + void *lua_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1408,12 +1410,11 @@ weechat_lua_api_config_section_write_default_cb (void *data, lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = script_ptr2str (config_file); lua_argv[2] = (section_name) ? (char *)section_name : empty_arg; - lua_argv[3] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sss", lua_argv); if (!rc) ret = WEECHAT_CONFIG_WRITE_ERROR; @@ -1443,7 +1444,8 @@ weechat_lua_api_config_section_create_option_cb (void *data, const char *value) { struct t_script_callback *script_callback; - char *lua_argv[6], empty_arg[1] = { '\0' }; + void *lua_argv[5]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1455,12 +1457,11 @@ weechat_lua_api_config_section_create_option_cb (void *data, lua_argv[2] = script_ptr2str (section); lua_argv[3] = (option_name) ? (char *)option_name : empty_arg; lua_argv[4] = (value) ? (char *)value : empty_arg; - lua_argv[5] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sssss", lua_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_SET_ERROR; @@ -1491,7 +1492,8 @@ weechat_lua_api_config_section_delete_option_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *lua_argv[5], empty_arg[1] = { '\0' }; + void *lua_argv[4]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1502,12 +1504,11 @@ weechat_lua_api_config_section_delete_option_cb (void *data, lua_argv[1] = script_ptr2str (config_file); lua_argv[2] = script_ptr2str (section); lua_argv[3] = script_ptr2str (option); - lua_argv[4] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "ssss", lua_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_UNSET_ERROR; @@ -1667,7 +1668,8 @@ weechat_lua_api_config_option_check_value_cb (void *data, const char *value) { struct t_script_callback *script_callback; - char *lua_argv[4], empty_arg[1] = { '\0' }; + void *lua_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1677,12 +1679,11 @@ weechat_lua_api_config_option_check_value_cb (void *data, lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = script_ptr2str (option); lua_argv[2] = (value) ? (char *)value : empty_arg; - lua_argv[3] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sss", lua_argv); if (!rc) ret = 0; @@ -1709,7 +1710,8 @@ weechat_lua_api_config_option_change_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *lua_argv[3], empty_arg[1] = { '\0' }; + void *lua_argv[2]; + char empty_arg[1] = { '\0' }; int *rc; script_callback = (struct t_script_callback *)data; @@ -1718,12 +1720,11 @@ weechat_lua_api_config_option_change_cb (void *data, { lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = script_ptr2str (option); - lua_argv[2] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "ss", lua_argv); if (lua_argv[1]) free (lua_argv[1]); @@ -1742,7 +1743,8 @@ weechat_lua_api_config_option_delete_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *lua_argv[3], empty_arg[1] = { '\0' }; + void *lua_argv[2]; + char empty_arg[1] = { '\0' }; int *rc; script_callback = (struct t_script_callback *)data; @@ -1751,12 +1753,11 @@ weechat_lua_api_config_option_delete_cb (void *data, { lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = script_ptr2str (option); - lua_argv[2] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "ss", lua_argv); if (lua_argv[1]) free (lua_argv[1]); @@ -3276,7 +3277,8 @@ weechat_lua_api_hook_command_cb (void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { struct t_script_callback *script_callback; - char *lua_argv[4], empty_arg[1] = { '\0' }; + void *lua_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; /* make C compiler happy */ @@ -3289,12 +3291,11 @@ weechat_lua_api_hook_command_cb (void *data, struct t_gui_buffer *buffer, lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = script_ptr2str (buffer); lua_argv[2] = (argc > 1) ? argv_eol[1] : empty_arg; - lua_argv[3] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3380,7 +3381,8 @@ weechat_lua_api_hook_command_run_cb (void *data, struct t_gui_buffer *buffer, const char *command) { struct t_script_callback *script_callback; - char *lua_argv[4], empty_arg[1] = { '\0' }; + void *lua_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3390,12 +3392,11 @@ weechat_lua_api_hook_command_run_cb (void *data, struct t_gui_buffer *buffer, lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = script_ptr2str (buffer); lua_argv[2] = (command) ? (char *)command : empty_arg; - lua_argv[3] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3467,7 +3468,8 @@ int weechat_lua_api_hook_timer_cb (void *data, int remaining_calls) { struct t_script_callback *script_callback; - char *lua_argv[3], str_remaining_calls[32], empty_arg[1] = { '\0' }; + void *lua_argv[2]; + char str_remaining_calls[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3479,12 +3481,11 @@ weechat_lua_api_hook_timer_cb (void *data, int remaining_calls) lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = str_remaining_calls; - lua_argv[2] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "ss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3560,7 +3561,8 @@ int weechat_lua_api_hook_fd_cb (void *data, int fd) { struct t_script_callback *script_callback; - char *lua_argv[3], str_fd[32], empty_arg[1] = { '\0' }; + void *lua_argv[2]; + char str_fd[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3571,12 +3573,11 @@ weechat_lua_api_hook_fd_cb (void *data, int fd) lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = str_fd; - lua_argv[2] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "ss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3657,7 +3658,8 @@ weechat_lua_api_hook_process_cb (void *data, const char *out, const char *err) { struct t_script_callback *script_callback; - char *lua_argv[6], str_rc[32], empty_arg[1] = { '\0' }; + void *lua_argv[5]; + char str_rc[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3671,12 +3673,11 @@ weechat_lua_api_hook_process_cb (void *data, lua_argv[2] = str_rc; lua_argv[3] = (out) ? (char *)out : empty_arg; lua_argv[4] = (err) ? (char *)err : empty_arg; - lua_argv[5] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sssss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3749,7 +3750,8 @@ weechat_lua_api_hook_connect_cb (void *data, int status, int gnutls_rc, const char *error, const char *ip_address) { struct t_script_callback *script_callback; - char *lua_argv[6], str_status[32], str_gnutls_rc[32]; + void *lua_argv[5]; + char str_status[32], str_gnutls_rc[32]; char empty_arg[1] = { '\0' }; int *rc, ret; @@ -3765,12 +3767,11 @@ weechat_lua_api_hook_connect_cb (void *data, int status, int gnutls_rc, lua_argv[2] = str_gnutls_rc; lua_argv[3] = (ip_address) ? (char *)ip_address : empty_arg; lua_argv[4] = (error) ? (char *)error : empty_arg; - lua_argv[5] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sssss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3862,7 +3863,8 @@ weechat_lua_api_hook_print_cb (void *data, struct t_gui_buffer *buffer, const char *prefix, const char *message) { struct t_script_callback *script_callback; - char *lua_argv[9], empty_arg[1] = { '\0' }; + void *lua_argv[8]; + char empty_arg[1] = { '\0' }; static char timebuffer[64]; int *rc, ret; @@ -3885,12 +3887,11 @@ weechat_lua_api_hook_print_cb (void *data, struct t_gui_buffer *buffer, lua_argv[5] = (highlight) ? strdup ("1") : strdup ("0"); lua_argv[6] = (prefix) ? (char *)prefix : empty_arg; lua_argv[7] = (message) ? (char *)message : empty_arg; - lua_argv[8] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "ssssssss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3978,7 +3979,8 @@ weechat_lua_api_hook_signal_cb (void *data, const char *signal, const char *type_data, void *signal_data) { struct t_script_callback *script_callback; - char *lua_argv[4], empty_arg[1] = { '\0' }; + void *lua_argv[3]; + char empty_arg[1] = { '\0' }; static char value_str[64]; int *rc, ret, free_needed; @@ -4006,12 +4008,11 @@ weechat_lua_api_hook_signal_cb (void *data, const char *signal, } else lua_argv[2] = empty_arg; - lua_argv[3] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -4141,7 +4142,8 @@ weechat_lua_api_hook_config_cb (void *data, const char *option, const char *value) { struct t_script_callback *script_callback; - char *lua_argv[4], empty_arg[1] = { '\0' }; + void *lua_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4151,12 +4153,11 @@ weechat_lua_api_hook_config_cb (void *data, const char *option, lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = (option) ? (char *)option : empty_arg; lua_argv[2] = (value) ? (char *)value : empty_arg; - lua_argv[3] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -4229,7 +4230,8 @@ weechat_lua_api_hook_completion_cb (void *data, const char *completion_item, struct t_gui_completion *completion) { struct t_script_callback *script_callback; - char *lua_argv[5], empty_arg[1] = { '\0' }; + void *lua_argv[4]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4240,12 +4242,11 @@ weechat_lua_api_hook_completion_cb (void *data, const char *completion_item, lua_argv[1] = (completion_item) ? (char *)completion_item : empty_arg; lua_argv[2] = script_ptr2str (buffer); lua_argv[3] = script_ptr2str (completion); - lua_argv[4] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "ssss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -4369,7 +4370,8 @@ weechat_lua_api_hook_modifier_cb (void *data, const char *modifier, const char *string) { struct t_script_callback *script_callback; - char *lua_argv[5], empty_arg[1] = { '\0' }; + void *lua_argv[4]; + char empty_arg[1] = { '\0' }; script_callback = (struct t_script_callback *)data; @@ -4379,12 +4381,11 @@ weechat_lua_api_hook_modifier_cb (void *data, const char *modifier, lua_argv[1] = (modifier) ? (char *)modifier : empty_arg; lua_argv[2] = (modifier_data) ? (char *)modifier_data : empty_arg; lua_argv[3] = (string) ? (char *)string : empty_arg; - lua_argv[4] = NULL; return (char *)weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - lua_argv); + "ssss", lua_argv); } return NULL; @@ -4486,7 +4487,8 @@ weechat_lua_api_hook_info_cb (void *data, const char *info_name, const char *arguments) { struct t_script_callback *script_callback; - char *lua_argv[4], empty_arg[1] = { '\0' }; + void *lua_argv[3]; + char empty_arg[1] = { '\0' }; script_callback = (struct t_script_callback *)data; @@ -4495,12 +4497,11 @@ weechat_lua_api_hook_info_cb (void *data, const char *info_name, lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = (info_name) ? (char *)info_name : empty_arg; lua_argv[2] = (arguments) ? (char *)arguments : empty_arg; - lua_argv[3] = NULL; return (const char *)weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - lua_argv); + "sss", lua_argv); } return NULL; @@ -4559,6 +4560,91 @@ weechat_lua_api_hook_info (lua_State *L) } /* + * weechat_lua_api_hook_info_hashtable_cb: callback for info_hashtable hooked + */ + +struct t_hashtable * +weechat_lua_api_hook_info_hashtable_cb (void *data, const char *info_name, + struct t_hashtable *hashtable) +{ + struct t_script_callback *script_callback; + void *lua_argv[3]; + char empty_arg[1] = { '\0' }; + + script_callback = (struct t_script_callback *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + lua_argv[1] = (info_name) ? (char *)info_name : empty_arg; + lua_argv[2] = hashtable; + + return (struct t_hashtable *)weechat_lua_exec (script_callback->script, + WEECHAT_SCRIPT_EXEC_HASHTABLE, + script_callback->function, + "ssh", lua_argv); + } + + return NULL; +} + +/* + * weechat_lua_api_hook_info_hashtable: hook an info_hashtable + */ + +static int +weechat_lua_api_hook_info_hashtable (lua_State *L) +{ + const char *info_name, *description, *args_description; + const char *output_description, *function, *data; + char *result; + int n; + + /* make C compiler happy */ + (void) L; + + if (!lua_current_script) + { + WEECHAT_SCRIPT_MSG_NOT_INIT(LUA_CURRENT_SCRIPT_NAME, "hook_info_hashtable"); + LUA_RETURN_EMPTY; + } + + info_name = NULL; + description = NULL; + args_description = NULL; + output_description = NULL; + function = NULL; + data = NULL; + + n = lua_gettop (lua_current_interpreter); + + if (n < 6) + { + WEECHAT_SCRIPT_MSG_WRONG_ARGS(LUA_CURRENT_SCRIPT_NAME, "hook_info_hashtable"); + LUA_RETURN_EMPTY; + } + + info_name = lua_tostring (lua_current_interpreter, -6); + description = lua_tostring (lua_current_interpreter, -5); + args_description = lua_tostring (lua_current_interpreter, -4); + output_description = lua_tostring (lua_current_interpreter, -3); + function = lua_tostring (lua_current_interpreter, -2); + data = lua_tostring (lua_current_interpreter, -1); + + result = script_ptr2str (script_api_hook_info_hashtable (weechat_lua_plugin, + lua_current_script, + info_name, + description, + args_description, + output_description, + &weechat_lua_api_hook_info_hashtable_cb, + function, + data)); + + LUA_RETURN_STRING_FREE(result); +} + +/* * weechat_lua_api_hook_infolist_cb: callback for infolist hooked */ @@ -4567,7 +4653,8 @@ weechat_lua_api_hook_infolist_cb (void *data, const char *info_name, void *pointer, const char *arguments) { struct t_script_callback *script_callback; - char *lua_argv[5], empty_arg[1] = { '\0' }; + void *lua_argv[4]; + char empty_arg[1] = { '\0' }; struct t_infolist *result; script_callback = (struct t_script_callback *)data; @@ -4578,12 +4665,11 @@ weechat_lua_api_hook_infolist_cb (void *data, const char *info_name, lua_argv[1] = (info_name) ? (char *)info_name : empty_arg; lua_argv[2] = script_ptr2str (pointer); lua_argv[3] = (arguments) ? (char *)arguments : empty_arg; - lua_argv[4] = NULL; result = (struct t_infolist *)weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - lua_argv); + "ssss", lua_argv); if (lua_argv[2]) free (lua_argv[2]); @@ -4718,7 +4804,8 @@ weechat_lua_api_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer, const char *input_data) { struct t_script_callback *script_callback; - char *lua_argv[4], empty_arg[1] = { '\0' }; + void *lua_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4728,12 +4815,11 @@ weechat_lua_api_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer, lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = script_ptr2str (buffer); lua_argv[2] = (input_data) ? (char *)input_data : empty_arg; - lua_argv[3] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "sss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -4759,7 +4845,8 @@ int weechat_lua_api_buffer_close_cb (void *data, struct t_gui_buffer *buffer) { struct t_script_callback *script_callback; - char *lua_argv[3], empty_arg[1] = { '\0' }; + void *lua_argv[2]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4768,12 +4855,11 @@ weechat_lua_api_buffer_close_cb (void *data, struct t_gui_buffer *buffer) { lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = script_ptr2str (buffer); - lua_argv[2] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "ss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -5806,7 +5892,8 @@ weechat_lua_api_bar_item_build_cb (void *data, struct t_gui_bar_item *item, struct t_gui_window *window) { struct t_script_callback *script_callback; - char *lua_argv[4], empty_arg[1] = { '\0' }, *ret; + void *lua_argv[3]; + char empty_arg[1] = { '\0' }, *ret; script_callback = (struct t_script_callback *)data; @@ -5815,12 +5902,11 @@ weechat_lua_api_bar_item_build_cb (void *data, struct t_gui_bar_item *item, lua_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; lua_argv[1] = script_ptr2str (item); lua_argv[2] = script_ptr2str (window); - lua_argv[3] = NULL; ret = (char *)weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - lua_argv); + "sss", lua_argv); if (lua_argv[1]) free (lua_argv[1]); @@ -6226,7 +6312,7 @@ weechat_lua_api_command (lua_State *L) } /* - * weechat_lua_api_info_get: get info about WeeChat + * weechat_lua_api_info_get: get info (as string) */ static int @@ -6264,6 +6350,53 @@ weechat_lua_api_info_get (lua_State *L) } /* + * weechat_lua_api_info_get_hashtable: get info (as hashtable) + */ + +static int +weechat_lua_api_info_get_hashtable (lua_State *L) +{ + const char *info_name; + struct t_hashtable *table, *result_hashtable; + int n; + + /* make C compiler happy */ + (void) L; + + if (!lua_current_script) + { + WEECHAT_SCRIPT_MSG_NOT_INIT(LUA_CURRENT_SCRIPT_NAME, "info_get_hashtable"); + LUA_RETURN_EMPTY; + } + + info_name = NULL; + table = NULL; + + n = lua_gettop (lua_current_interpreter); + + if (n < 2) + { + WEECHAT_SCRIPT_MSG_WRONG_ARGS(LUA_CURRENT_SCRIPT_NAME, "info_get_hashtable"); + LUA_RETURN_EMPTY; + } + + info_name = lua_tostring (lua_current_interpreter, -2); + table = weechat_lua_tohashtable (lua_current_interpreter, -1, + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE); + + result_hashtable = weechat_info_get_hashtable (info_name, table); + + weechat_lua_pushhashtable (lua_current_interpreter, result_hashtable); + + if (table) + weechat_hashtable_free (table); + if (result_hashtable) + weechat_hashtable_free (result_hashtable); + + return 1; +} + +/* * weechat_lua_api_infolist_new: create new infolist */ @@ -6938,7 +7071,8 @@ weechat_lua_api_upgrade_read_cb (void *data, struct t_infolist *infolist) { struct t_script_callback *script_callback; - char *lua_argv[5], empty_arg[1] = { '\0' }, str_object_id[32]; + void *lua_argv[4]; + char empty_arg[1] = { '\0' }, str_object_id[32]; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -6951,12 +7085,11 @@ weechat_lua_api_upgrade_read_cb (void *data, lua_argv[1] = script_ptr2str (upgrade_file); lua_argv[2] = str_object_id; lua_argv[3] = script_ptr2str (infolist); - lua_argv[4] = NULL; rc = (int *) weechat_lua_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - lua_argv); + "ssss", lua_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -7531,6 +7664,7 @@ const struct luaL_reg weechat_lua_api_funcs[] = { { "hook_modifier", &weechat_lua_api_hook_modifier }, { "hook_modifier_exec", &weechat_lua_api_hook_modifier_exec }, { "hook_info", &weechat_lua_api_hook_info }, + { "hook_info_hashtable", &weechat_lua_api_hook_info_hashtable }, { "hook_infolist", &weechat_lua_api_hook_infolist }, { "unhook", &weechat_lua_api_unhook }, { "unhook_all", &weechat_lua_api_unhook_all }, @@ -7570,6 +7704,7 @@ const struct luaL_reg weechat_lua_api_funcs[] = { { "bar_remove", &weechat_lua_api_bar_remove }, { "command", &weechat_lua_api_command }, { "info_get", &weechat_lua_api_info_get }, + { "info_get_hashtable", &weechat_lua_api_info_get_hashtable }, { "infolist_new", &weechat_lua_api_infolist_new }, { "infolist_new_item", &weechat_lua_api_infolist_new_item }, { "infolist_new_var_integer", &weechat_lua_api_infolist_new_var_integer }, diff --git a/src/plugins/scripts/lua/weechat-lua.c b/src/plugins/scripts/lua/weechat-lua.c index 10248ed21..aeea789d4 100644 --- a/src/plugins/scripts/lua/weechat-lua.c +++ b/src/plugins/scripts/lua/weechat-lua.c @@ -70,15 +70,87 @@ char *lua_action_remove_list = NULL; /* - * weechat_lua_exec: execute a Lua script + * weechat_lua_hashtable_map_cb: callback called for each key/value in a + * hashtable + */ + +void +weechat_lua_hashtable_map_cb (void *data, + struct t_hashtable *hashtable, + const void *key, + const void *value) +{ + lua_State *interpreter; + + /* make C compiler happy */ + (void) hashtable; + + interpreter = (lua_State *)data; + + lua_pushstring (interpreter, (char *)key); + lua_pushstring (interpreter, (char *)value); + lua_rawset (interpreter, -3); +} + +/* + * weechat_lua_pushhashtable: put a WeeChat hashtable on lua stack, as lua table + */ + +void +weechat_lua_pushhashtable (lua_State *interpreter, struct t_hashtable *hashtable) +{ + lua_newtable (interpreter); + + weechat_hashtable_map (hashtable, + &weechat_lua_hashtable_map_cb, + interpreter); +} + +/* + * weechat_lua_hash_to_hashtable: get WeeChat hashtable with lua hash (on stack) + * 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_lua_tohashtable (lua_State *interpreter, int index, int hashtable_size) +{ + struct t_hashtable *hashtable; + + hashtable = weechat_hashtable_new (hashtable_size, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + if (!hashtable) + return NULL; + + lua_pushnil (interpreter); + while (lua_next (interpreter, index - 1) != 0) + { + weechat_hashtable_set (hashtable, + (char *)lua_tostring (interpreter, -2), + (char *)lua_tostring (interpreter, -1)); + /* remove value from stack (keep key for next iteration) */ + lua_pop (interpreter, 1); + } + + return hashtable; +} + +/* + * weechat_lua_exec: execute a lua function */ void * -weechat_lua_exec (struct t_plugin_script *script, - int ret_type, const char *function, char **argv) +weechat_lua_exec (struct t_plugin_script *script, int ret_type, + const char *function, + const char *format, void **argv) { void *ret_value; - int argc, *ret_i; + int argc, i, *ret_i; struct t_plugin_script *old_lua_current_script; lua_current_interpreter = script->interpreter; @@ -87,47 +159,24 @@ weechat_lua_exec (struct t_plugin_script *script, old_lua_current_script = lua_current_script; lua_current_script = script; - + argc = 0; - if (argv && argv[0]) + if (format && format[0]) { - lua_pushstring (lua_current_interpreter, argv[0]); - argc = 1; - if (argv[1]) + argc = strlen (format); + for (i = 0; i < argc; i++) { - argc = 2; - lua_pushstring (lua_current_interpreter, argv[1]); - if (argv[2]) + switch (format[i]) { - argc = 3; - lua_pushstring (lua_current_interpreter, argv[2]); - if (argv[3]) - { - argc = 4; - lua_pushstring (lua_current_interpreter, argv[3]); - if (argv[4]) - { - argc = 5; - lua_pushstring (lua_current_interpreter, argv[4]); - if (argv[5]) - { - argc = 6; - lua_pushstring (lua_current_interpreter, argv[5]); - if (argv[6]) - { - argc = 7; - lua_pushstring (lua_current_interpreter, - argv[6]); - if (argv[7]) - { - argc = 8; - lua_pushstring (lua_current_interpreter, - argv[7]); - } - } - } - } - } + case 's': /* string */ + lua_pushstring (lua_current_interpreter, (char *)argv[i]); + break; + case 'i': /* integer */ + lua_pushnumber (lua_current_interpreter, *((int *)argv[i])); + break; + case 'h': /* hash */ + weechat_lua_pushhashtable (lua_current_interpreter, (struct t_hashtable *)argv[i]); + break; } } } @@ -154,6 +203,11 @@ weechat_lua_exec (struct t_plugin_script *script, *ret_i = lua_tonumber (lua_current_interpreter, -1); ret_value = ret_i; } + else if (ret_type == WEECHAT_SCRIPT_EXEC_HASHTABLE) + { + ret_value = weechat_lua_tohashtable (lua_current_interpreter, -1, + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE); + } else { WEECHAT_SCRIPT_MSG_WRONG_ARGS(LUA_CURRENT_SCRIPT_NAME, function); @@ -166,6 +220,10 @@ weechat_lua_exec (struct t_plugin_script *script, return ret_value; } +/* + * weechat_lua_load: load a Lua script + */ + int weechat_lua_load (const char *filename) { @@ -308,7 +366,6 @@ void weechat_lua_unload (struct t_plugin_script *script) { int *r; - char *lua_argv[1] = { NULL }; void *interpreter; if ((weechat_lua_plugin->debug >= 1) || !lua_quiet) @@ -323,7 +380,7 @@ weechat_lua_unload (struct t_plugin_script *script) r = weechat_lua_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, - lua_argv); + NULL, NULL); if (r) free (r); } diff --git a/src/plugins/scripts/lua/weechat-lua.h b/src/plugins/scripts/lua/weechat-lua.h index fe5c11fc1..ce7460bd8 100644 --- a/src/plugins/scripts/lua/weechat-lua.h +++ b/src/plugins/scripts/lua/weechat-lua.h @@ -36,8 +36,13 @@ extern struct t_plugin_script *lua_registered_script; extern const char *lua_current_script_filename; extern lua_State *lua_current_interpreter; -extern void *weechat_lua_exec (struct t_plugin_script *script, - int ret_type, const char *function, - char **argv); +extern void weechat_lua_pushhashtable (lua_State *interpreter, + struct t_hashtable *hashtable); +extern struct t_hashtable *weechat_lua_tohashtable (lua_State *interpreter, + int index, + int hashtable_size); +extern void *weechat_lua_exec (struct t_plugin_script *script, int ret_type, + const char *function, + const char *format, void **argv); #endif /* __WEECHAT_LUA_H */ diff --git a/src/plugins/scripts/perl/weechat-perl-api.c b/src/plugins/scripts/perl/weechat-perl-api.c index e38f0a7c3..6d0e8257b 100644 --- a/src/plugins/scripts/perl/weechat-perl-api.c +++ b/src/plugins/scripts/perl/weechat-perl-api.c @@ -56,8 +56,12 @@ } \ XST_mPV (0, ""); \ XSRETURN (1) -#define PERL_RETURN_INT(__int) \ - XST_mIV (0, __int); \ +#define PERL_RETURN_INT(__int) \ + XST_mIV (0, __int); \ + XSRETURN (1); +#define PERL_RETURN_OBJ(__obj) \ + ST (0) = newRV_inc((SV *)__obj); \ + if (SvREFCNT(ST(0))) sv_2mortal(ST(0)); \ XSRETURN (1); @@ -999,7 +1003,8 @@ weechat_perl_api_config_reload_cb (void *data, struct t_config_file *config_file) { struct t_script_callback *script_callback; - char *perl_argv[3], empty_arg[1] = { '\0' }; + void *perl_argv[2]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1008,12 +1013,11 @@ weechat_perl_api_config_reload_cb (void *data, { perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = script_ptr2str (config_file); - perl_argv[2] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "ss", perl_argv); if (!rc) ret = WEECHAT_CONFIG_READ_FILE_NOT_FOUND; @@ -1081,7 +1085,8 @@ weechat_perl_api_config_section_read_cb (void *data, const char *value) { struct t_script_callback *script_callback; - char *perl_argv[6], empty_arg[1] = { '\0' }; + void *perl_argv[5]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1093,12 +1098,11 @@ weechat_perl_api_config_section_read_cb (void *data, perl_argv[2] = script_ptr2str (section); perl_argv[3] = (option_name) ? (char *)option_name : empty_arg; perl_argv[4] = (value) ? (char *)value : empty_arg; - perl_argv[5] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "sssss", perl_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_SET_ERROR; @@ -1128,7 +1132,8 @@ weechat_perl_api_config_section_write_cb (void *data, const char *section_name) { struct t_script_callback *script_callback; - char *perl_argv[4], empty_arg[1] = { '\0' }; + void *perl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1138,12 +1143,11 @@ weechat_perl_api_config_section_write_cb (void *data, perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = script_ptr2str (config_file); perl_argv[2] = (section_name) ? (char *)section_name : empty_arg; - perl_argv[3] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "sss", perl_argv); if (!rc) ret = WEECHAT_CONFIG_WRITE_ERROR; @@ -1172,7 +1176,8 @@ weechat_perl_api_config_section_write_default_cb (void *data, const char *section_name) { struct t_script_callback *script_callback; - char *perl_argv[4], empty_arg[1] = { '\0' }; + void *perl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1182,13 +1187,12 @@ weechat_perl_api_config_section_write_default_cb (void *data, perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = script_ptr2str (config_file); perl_argv[2] = (section_name) ? (char *)section_name : empty_arg; - perl_argv[3] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); - + "sss", perl_argv); + if (!rc) ret = WEECHAT_CONFIG_WRITE_ERROR; else @@ -1217,7 +1221,8 @@ weechat_perl_api_config_section_create_option_cb (void *data, const char *value) { struct t_script_callback *script_callback; - char *perl_argv[6], empty_arg[1] = { '\0' }; + void *perl_argv[5]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1229,12 +1234,11 @@ weechat_perl_api_config_section_create_option_cb (void *data, perl_argv[2] = script_ptr2str (section); perl_argv[3] = (option_name) ? (char *)option_name : empty_arg; perl_argv[4] = (value) ? (char *)value : empty_arg; - perl_argv[5] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "sssss", perl_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_SET_ERROR; @@ -1265,7 +1269,8 @@ weechat_perl_api_config_section_delete_option_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *perl_argv[5], empty_arg[1] = { '\0' }; + void *perl_argv[4]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1276,12 +1281,11 @@ weechat_perl_api_config_section_delete_option_cb (void *data, perl_argv[1] = script_ptr2str (config_file); perl_argv[2] = script_ptr2str (section); perl_argv[3] = script_ptr2str (option); - perl_argv[4] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "ssss", perl_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_UNSET_ERROR; @@ -1413,7 +1417,8 @@ weechat_perl_api_config_option_check_value_cb (void *data, const char *value) { struct t_script_callback *script_callback; - char *perl_argv[4], empty_arg[1] = { '\0' }; + void *perl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1423,12 +1428,11 @@ weechat_perl_api_config_option_check_value_cb (void *data, perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = script_ptr2str (option); perl_argv[2] = (value) ? (char *)value : empty_arg; - perl_argv[3] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "sss", perl_argv); if (!rc) ret = 0; @@ -1455,7 +1459,8 @@ weechat_perl_api_config_option_change_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *perl_argv[3], empty_arg[1] = { '\0' }; + void *perl_argv[2]; + char empty_arg[1] = { '\0' }; int *rc; script_callback = (struct t_script_callback *)data; @@ -1464,12 +1469,11 @@ weechat_perl_api_config_option_change_cb (void *data, { perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = script_ptr2str (option); - perl_argv[2] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "ss", perl_argv); if (perl_argv[1]) free (perl_argv[1]); @@ -1488,7 +1492,8 @@ weechat_perl_api_config_option_delete_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *perl_argv[3], empty_arg[1] = { '\0' }; + void *perl_argv[2]; + char empty_arg[1] = { '\0' }; int *rc; script_callback = (struct t_script_callback *)data; @@ -1497,12 +1502,11 @@ weechat_perl_api_config_option_delete_cb (void *data, { perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = script_ptr2str (option); - perl_argv[2] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "ss", perl_argv); if (perl_argv[1]) free (perl_argv[1]); @@ -2741,7 +2745,8 @@ weechat_perl_api_hook_command_cb (void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { struct t_script_callback *script_callback; - char *perl_argv[4], empty_arg[1] = { '\0' }; + void *perl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; /* make C compiler happy */ @@ -2754,12 +2759,11 @@ weechat_perl_api_hook_command_cb (void *data, struct t_gui_buffer *buffer, perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = script_ptr2str (buffer); perl_argv[2] = (argc > 1) ? argv_eol[1] : empty_arg; - perl_argv[3] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "sss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -2833,7 +2837,8 @@ weechat_perl_api_hook_command_run_cb (void *data, struct t_gui_buffer *buffer, const char *command) { struct t_script_callback *script_callback; - char *perl_argv[4], empty_arg[1] = { '\0' }; + void *perl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -2843,12 +2848,11 @@ weechat_perl_api_hook_command_run_cb (void *data, struct t_gui_buffer *buffer, perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = script_ptr2str (buffer); perl_argv[2] = (command) ? (char *)command : empty_arg; - perl_argv[3] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "sss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -2912,7 +2916,8 @@ int weechat_perl_api_hook_timer_cb (void *data, int remaining_calls) { struct t_script_callback *script_callback; - char *perl_argv[3], str_remaining_calls[32], empty_arg[1] = { '\0' }; + void *perl_argv[2]; + char str_remaining_calls[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -2924,12 +2929,11 @@ weechat_perl_api_hook_timer_cb (void *data, int remaining_calls) perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = str_remaining_calls; - perl_argv[2] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "ss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -2989,7 +2993,8 @@ int weechat_perl_api_hook_fd_cb (void *data, int fd) { struct t_script_callback *script_callback; - char *perl_argv[3], str_fd[32], empty_arg[1] = { '\0' }; + void *perl_argv[2]; + char str_fd[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3000,12 +3005,11 @@ weechat_perl_api_hook_fd_cb (void *data, int fd) perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = str_fd; - perl_argv[2] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "ss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3068,7 +3072,8 @@ weechat_perl_api_hook_process_cb (void *data, const char *out, const char *err) { struct t_script_callback *script_callback; - char *perl_argv[6], str_rc[32], empty_arg[1] = { '\0' }; + void *perl_argv[5]; + char str_rc[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3082,12 +3087,11 @@ weechat_perl_api_hook_process_cb (void *data, perl_argv[2] = str_rc; perl_argv[3] = (out) ? (char *)out : empty_arg; perl_argv[4] = (err) ? (char *)err : empty_arg; - perl_argv[5] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "sssss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3151,7 +3155,8 @@ weechat_perl_api_hook_connect_cb (void *data, int status, int gnutls_rc, const char *error, const char *ip_address) { struct t_script_callback *script_callback; - char *perl_argv[6], str_status[32], str_gnutls_rc[32]; + void *perl_argv[5]; + char str_status[32], str_gnutls_rc[32]; char empty_arg[1] = { '\0' }; int *rc, ret; @@ -3167,12 +3172,11 @@ weechat_perl_api_hook_connect_cb (void *data, int status, int gnutls_rc, perl_argv[2] = str_gnutls_rc; perl_argv[3] = (ip_address) ? (char *)ip_address : empty_arg; perl_argv[4] = (error) ? (char *)error : empty_arg; - perl_argv[5] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "sssss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3248,7 +3252,8 @@ weechat_perl_api_hook_print_cb (void *data, struct t_gui_buffer *buffer, const char *prefix, const char *message) { struct t_script_callback *script_callback; - char *perl_argv[9], empty_arg[1] = { '\0' }; + void *perl_argv[8]; + char empty_arg[1] = { '\0' }; static char timebuffer[64]; int *rc, ret; @@ -3271,12 +3276,11 @@ weechat_perl_api_hook_print_cb (void *data, struct t_gui_buffer *buffer, perl_argv[5] = (highlight) ? strdup ("1") : strdup ("0"); perl_argv[6] = (prefix) ? (char *)prefix : empty_arg; perl_argv[7] = (message) ? (char *)message : empty_arg; - perl_argv[8] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "ssssssss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3352,7 +3356,8 @@ weechat_perl_api_hook_signal_cb (void *data, const char *signal, const char *typ void *signal_data) { struct t_script_callback *script_callback; - char *perl_argv[4], empty_arg[1] = { '\0' }; + void *perl_argv[3]; + char empty_arg[1] = { '\0' }; static char value_str[64]; int *rc, ret, free_needed; @@ -3380,12 +3385,11 @@ weechat_perl_api_hook_signal_cb (void *data, const char *signal, const char *typ } else perl_argv[2] = empty_arg; - perl_argv[3] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "sss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3502,7 +3506,8 @@ int weechat_perl_api_hook_config_cb (void *data, const char *option, const char *value) { struct t_script_callback *script_callback; - char *perl_argv[4], empty_arg[1] = { '\0' }; + void *perl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3512,12 +3517,11 @@ weechat_perl_api_hook_config_cb (void *data, const char *option, const char *val perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = (option) ? (char *)option : empty_arg; perl_argv[2] = (value) ? (char *)value : empty_arg; - perl_argv[3] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "sss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3581,7 +3585,8 @@ weechat_perl_api_hook_completion_cb (void *data, const char *completion_item, struct t_gui_completion *completion) { struct t_script_callback *script_callback; - char *perl_argv[5], empty_arg[1] = { '\0' }; + void *perl_argv[4]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3592,12 +3597,11 @@ weechat_perl_api_hook_completion_cb (void *data, const char *completion_item, perl_argv[1] = (completion_item) ? (char *)completion_item : empty_arg; perl_argv[2] = script_ptr2str (buffer); perl_argv[3] = script_ptr2str (completion); - perl_argv[4] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "ssss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3702,7 +3706,8 @@ weechat_perl_api_hook_modifier_cb (void *data, const char *modifier, const char *modifier_data, const char *string) { struct t_script_callback *script_callback; - char *perl_argv[5], empty_arg[1] = { '\0' }; + void *perl_argv[4]; + char empty_arg[1] = { '\0' }; script_callback = (struct t_script_callback *)data; @@ -3712,12 +3717,11 @@ weechat_perl_api_hook_modifier_cb (void *data, const char *modifier, perl_argv[1] = (modifier) ? (char *)modifier : empty_arg; perl_argv[2] = (modifier_data) ? (char *)modifier_data : empty_arg; perl_argv[3] = (string) ? (char *)string : empty_arg; - perl_argv[4] = NULL; return (char *)weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - perl_argv); + "ssss", perl_argv); } return NULL; @@ -3803,7 +3807,8 @@ weechat_perl_api_hook_info_cb (void *data, const char *info_name, const char *arguments) { struct t_script_callback *script_callback; - char *perl_argv[4], empty_arg[1] = { '\0' }; + void *perl_argv[3]; + char empty_arg[1] = { '\0' }; script_callback = (struct t_script_callback *)data; @@ -3812,12 +3817,11 @@ weechat_perl_api_hook_info_cb (void *data, const char *info_name, perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = (info_name) ? (char *)info_name : empty_arg; perl_argv[2] = (arguments) ? (char *)arguments : empty_arg; - perl_argv[3] = NULL; return (const char *)weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - perl_argv); + "sss", perl_argv); } return NULL; @@ -3866,6 +3870,80 @@ XS (XS_weechat_api_hook_info) } /* + * weechat_perl_api_hook_info_hashtable_cb: callback for info_hashtable hooked + */ + +struct t_hashtable * +weechat_perl_api_hook_info_hashtable_cb (void *data, const char *info_name, + struct t_hashtable *hashtable) +{ + struct t_script_callback *script_callback; + void *perl_argv[3]; + char empty_arg[1] = { '\0' }; + + script_callback = (struct t_script_callback *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + perl_argv[1] = (info_name) ? (char *)info_name : empty_arg; + perl_argv[2] = hashtable; + + return (struct t_hashtable *)weechat_perl_exec (script_callback->script, + WEECHAT_SCRIPT_EXEC_HASHTABLE, + script_callback->function, + "ssh", perl_argv); + } + + return NULL; +} + +/* + * weechat::hook_info_hashtable: hook an info_hashtable + */ + +XS (XS_weechat_api_hook_info_hashtable) +{ + char *result, *info_name, *description, *args_description; + char *output_description, *function, *data; + dXSARGS; + + /* make C compiler happy */ + (void) cv; + + if (!perl_current_script) + { + WEECHAT_SCRIPT_MSG_NOT_INIT(PERL_CURRENT_SCRIPT_NAME, "hook_info_hashtable"); + PERL_RETURN_EMPTY; + } + + if (items < 6) + { + WEECHAT_SCRIPT_MSG_WRONG_ARGS(PERL_CURRENT_SCRIPT_NAME, "hook_info_hashtable"); + PERL_RETURN_EMPTY; + } + + info_name = SvPV (ST (0), PL_na); + description = SvPV (ST (1), PL_na); + args_description = SvPV (ST (2), PL_na); + output_description = SvPV (ST (3), PL_na); + function = SvPV (ST (4), PL_na); + data = SvPV (ST (5), PL_na); + + result = script_ptr2str (script_api_hook_info_hashtable (weechat_perl_plugin, + perl_current_script, + info_name, + description, + args_description, + output_description, + &weechat_perl_api_hook_info_hashtable_cb, + function, + data)); + + PERL_RETURN_STRING_FREE(result); +} + +/* * weechat_perl_api_hook_infolist_cb: callback for infolist hooked */ @@ -3874,7 +3952,8 @@ weechat_perl_api_hook_infolist_cb (void *data, const char *infolist_name, void *pointer, const char *arguments) { struct t_script_callback *script_callback; - char *perl_argv[5], empty_arg[1] = { '\0' }; + void *perl_argv[4]; + char empty_arg[1] = { '\0' }; struct t_infolist *result; script_callback = (struct t_script_callback *)data; @@ -3885,12 +3964,11 @@ weechat_perl_api_hook_infolist_cb (void *data, const char *infolist_name, perl_argv[1] = (infolist_name) ? (char *)infolist_name : empty_arg; perl_argv[2] = script_ptr2str (pointer); perl_argv[3] = (arguments) ? (char *)arguments : empty_arg; - perl_argv[4] = NULL; result = (struct t_infolist *)weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - perl_argv); + "ssss", perl_argv); if (perl_argv[2]) free (perl_argv[2]); @@ -4008,7 +4086,8 @@ weechat_perl_api_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer, const char *input_data) { struct t_script_callback *script_callback; - char *perl_argv[4], empty_arg[1] = { '\0' }; + void *perl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4018,12 +4097,11 @@ weechat_perl_api_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer, perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = script_ptr2str (buffer); perl_argv[2] = (input_data) ? (char *)input_data : empty_arg; - perl_argv[3] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "sss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; else @@ -4048,7 +4126,8 @@ int weechat_perl_api_buffer_close_cb (void *data, struct t_gui_buffer *buffer) { struct t_script_callback *script_callback; - char *perl_argv[3], empty_arg[1] = { '\0' }; + void *perl_argv[2]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4057,12 +4136,11 @@ weechat_perl_api_buffer_close_cb (void *data, struct t_gui_buffer *buffer) { perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = script_ptr2str (buffer); - perl_argv[2] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "ss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; else @@ -4917,7 +4995,8 @@ weechat_perl_api_bar_item_build_cb (void *data, struct t_gui_bar_item *item, struct t_gui_window *window) { struct t_script_callback *script_callback; - char *perl_argv[4], empty_arg[1] = { '\0' }, *ret; + void *perl_argv[3]; + char empty_arg[1] = { '\0' }, *ret; script_callback = (struct t_script_callback *)data; @@ -4926,12 +5005,11 @@ weechat_perl_api_bar_item_build_cb (void *data, struct t_gui_bar_item *item, perl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; perl_argv[1] = script_ptr2str (item); perl_argv[2] = script_ptr2str (window); - perl_argv[3] = NULL; ret = (char *)weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - perl_argv); + "sss", perl_argv); if (perl_argv[1]) free (perl_argv[1]); @@ -5255,7 +5333,7 @@ XS (XS_weechat_api_command) } /* - * weechat::info_get: get info about WeeChat + * weechat::info_get: get info (as string) */ XS (XS_weechat_api_info_get) @@ -5288,6 +5366,47 @@ XS (XS_weechat_api_info_get) } /* + * weechat::info_get_hashtable: get info (as hashtable) + */ + +XS (XS_weechat_api_info_get_hashtable) +{ + char *info_name; + struct t_hashtable *hashtable, *result_hashtable; + HV *result_hash; + dXSARGS; + + /* make C compiler happy */ + (void) cv; + + if (!perl_current_script) + { + WEECHAT_SCRIPT_MSG_NOT_INIT(PERL_CURRENT_SCRIPT_NAME, "info_get_hashtable"); + PERL_RETURN_EMPTY; + } + + if (items < 2) + { + WEECHAT_SCRIPT_MSG_WRONG_ARGS(PERL_CURRENT_SCRIPT_NAME, "info_get_hashtable"); + PERL_RETURN_EMPTY; + } + + info_name = SvPV (ST (0), PL_na); + hashtable = weechat_perl_hash_to_hashtable (ST (1), + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE); + + result_hashtable = weechat_info_get_hashtable (info_name, hashtable); + result_hash = weechat_perl_hashtable_to_hash (result_hashtable); + + if (hashtable) + weechat_hashtable_free (hashtable); + if (result_hashtable) + weechat_hashtable_free (result_hashtable); + + PERL_RETURN_OBJ(result_hash); +} + +/* * weechat::infolist_new: create new infolist */ @@ -5841,7 +5960,8 @@ weechat_perl_api_upgrade_read_cb (void *data, struct t_infolist *infolist) { struct t_script_callback *script_callback; - char *perl_argv[5], empty_arg[1] = { '\0' }, str_object_id[32]; + void *perl_argv[4]; + char empty_arg[1] = { '\0' }, str_object_id[32]; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -5854,12 +5974,11 @@ weechat_perl_api_upgrade_read_cb (void *data, perl_argv[1] = script_ptr2str (upgrade_file); perl_argv[2] = str_object_id; perl_argv[3] = script_ptr2str (infolist); - perl_argv[4] = NULL; rc = (int *) weechat_perl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - perl_argv); + "ssss", perl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -6046,6 +6165,7 @@ weechat_perl_api_init (pTHX) newXS ("weechat::hook_modifier", XS_weechat_api_hook_modifier, "weechat"); newXS ("weechat::hook_modifier_exec", XS_weechat_api_hook_modifier_exec, "weechat"); newXS ("weechat::hook_info", XS_weechat_api_hook_info, "weechat"); + newXS ("weechat::hook_info_hashtable", XS_weechat_api_hook_info_hashtable, "weechat"); newXS ("weechat::hook_infolist", XS_weechat_api_hook_infolist, "weechat"); newXS ("weechat::unhook", XS_weechat_api_unhook, "weechat"); newXS ("weechat::unhook_all", XS_weechat_api_unhook_all, "weechat"); @@ -6085,6 +6205,7 @@ weechat_perl_api_init (pTHX) newXS ("weechat::bar_remove", XS_weechat_api_bar_remove, "weechat"); newXS ("weechat::command", XS_weechat_api_command, "weechat"); newXS ("weechat::info_get", XS_weechat_api_info_get, "weechat"); + newXS ("weechat::info_get_hashtable", XS_weechat_api_info_get_hashtable, "weechat"); newXS ("weechat::infolist_new", XS_weechat_api_infolist_new, "weechat"); newXS ("weechat::infolist_new_item", XS_weechat_api_infolist_new_item, "weechat"); newXS ("weechat::infolist_new_var_integer", XS_weechat_api_infolist_new_var_integer, "weechat"); diff --git a/src/plugins/scripts/perl/weechat-perl.c b/src/plugins/scripts/perl/weechat-perl.c index 7de8af730..32a7ff41a 100644 --- a/src/plugins/scripts/perl/weechat-perl.c +++ b/src/plugins/scripts/perl/weechat-perl.c @@ -127,12 +127,130 @@ char *perl_weechat_code = /* - * weechat_perl_exec: execute a Perl script + * weechat_perl_hashtable_map_cb: callback called for each key/value in a + * hashtable + */ + +void +weechat_perl_hashtable_map_cb (void *data, + struct t_hashtable *hashtable, + const void *key, + const void *value) +{ + HV *hash; + + /* make C compiler happy */ + (void) hashtable; + + hash = (HV *)data; + + (void) hv_store (hash, (char *)key, strlen ((char *)key), + newSVpv ((char *)value, 0), 0); +} + +/* + * weechat_perl_hashtable_to_hash: get perl hash with a WeeChat hashtable + */ + +HV * +weechat_perl_hashtable_to_hash (struct t_hashtable *hashtable) +{ + HV *hash; + + hash = (HV *)newHV (); + if (!hash) + return NULL; + + weechat_hashtable_map (hashtable, + &weechat_perl_hashtable_map_cb, + hash); + + return hash; +} + +/* + * weechat_perl_hash_to_hashtable: get WeeChat hashtable with perl hash + * 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_perl_hash_to_hashtable (SV *hash, int hashtable_size) +{ + struct t_hashtable *hashtable; + HV *hash2; + SV *value; + char *str_key; + I32 retlen; + + hashtable = weechat_hashtable_new (hashtable_size, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + if (!hashtable) + return NULL; + + if ((hash) && SvROK(hash) && SvRV(hash) && (SvTYPE(SvRV(hash)) == SVt_PVHV)) + { + hash2 = (HV *) SvRV(hash); + hv_iterinit (hash2); + while ((value = hv_iternextsv (hash2, &str_key, &retlen))) + { + weechat_hashtable_set (hashtable, str_key, SvPV (value, PL_na)); + } + } + + return hashtable; +} + +/* + * weechat_perl_exec_pv: encapsulation of call to perl_call_pv + */ + +int +weechat_perl_exec_pv (const char *func, const char *format, void **argv) +{ + int i, argc; + HV *hash; + + dSP; + + PUSHMARK(SP); + if (format && format[0]) + { + argc = strlen (format); + for (i = 0; i < argc; i++) + { + switch (format[i]) + { + case 's': /* string */ + XPUSHs(sv_2mortal(newSVpv((char *)argv[i], 0))); + break; + case 'i': /* integer */ + XPUSHs(sv_2mortal(newSViv(*((int *)argv[i])))); + break; + case 'h': /* hash */ + hash = weechat_perl_hashtable_to_hash (argv[i]); + XPUSHs(sv_2mortal((SV *)hash)); + break; + } + } + PUTBACK; + } + return perl_call_pv (func, G_EVAL | G_SCALAR); +} + +/* + * weechat_perl_exec: execute a perl function */ void * weechat_perl_exec (struct t_plugin_script *script, - int ret_type, const char *function, char **argv) + int ret_type, const char *function, + const char *format, void **argv) { char *func; unsigned int count; @@ -166,12 +284,12 @@ weechat_perl_exec (struct t_plugin_script *script, ENTER; SAVETMPS; - PUSHMARK(sp); - count = perl_call_argv (func, G_EVAL | G_SCALAR, argv); + count = weechat_perl_exec_pv (func, format, argv); + ret_value = NULL; mem_err = 1; - + SPAGAIN; if (SvTRUE (ERRSV)) @@ -209,6 +327,11 @@ weechat_perl_exec (struct t_plugin_script *script, *ret_i = POPi; ret_value = ret_i; } + else if (ret_type == WEECHAT_SCRIPT_EXEC_HASHTABLE) + { + ret_value = weechat_perl_hash_to_hashtable (POPs, + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE); + } else { weechat_printf (NULL, @@ -221,7 +344,6 @@ weechat_perl_exec (struct t_plugin_script *script, } } - PUTBACK; FREETMPS; LEAVE; @@ -255,7 +377,7 @@ weechat_perl_load (const char *filename) struct t_plugin_script temp_script; int *eval; struct stat buf; - char *perl_argv[2]; + void *perl_argv[2]; #ifdef MULTIPLICITY PerlInterpreter *perl_current_interpreter; @@ -311,20 +433,22 @@ weechat_perl_load (const char *filename) perl_args_count, perl_args, NULL); eval_pv (perl_weechat_code, TRUE); - perl_argv[0] = (char *)filename; - perl_argv[1] = NULL; + perl_argv[0] = (void *)filename; + eval = weechat_perl_exec (&temp_script, + WEECHAT_SCRIPT_EXEC_INT, + "weechat_perl_load_eval_file", + "s", perl_argv); #else snprintf (pkgname, sizeof(pkgname), "%s%d", PKG_NAME_PREFIX, perl_num); perl_num++; temp_script.interpreter = "WeechatPerlScriptLoader"; - perl_argv[0] = (char *)filename; + perl_argv[0] = (void *)filename; perl_argv[1] = pkgname; - perl_argv[2] = NULL; -#endif eval = weechat_perl_exec (&temp_script, WEECHAT_SCRIPT_EXEC_INT, "weechat_perl_load_eval_file", - perl_argv); + "ss", perl_argv); +#endif if (!eval) { weechat_printf (NULL, @@ -434,7 +558,6 @@ void weechat_perl_unload (struct t_plugin_script *script) { int *r; - char *perl_argv[1] = { NULL }; void *interpreter; if ((weechat_perl_plugin->debug >= 1) || !perl_quiet) @@ -455,7 +578,7 @@ weechat_perl_unload (struct t_plugin_script *script) r = (int *) weechat_perl_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, - perl_argv); + NULL, NULL); if (r) free (r); } @@ -470,8 +593,11 @@ weechat_perl_unload (struct t_plugin_script *script) script); #ifdef MULTIPLICITY - perl_destruct (interpreter); - perl_free (interpreter); + if (interpreter) + { + perl_destruct (interpreter); + perl_free (interpreter); + } #else if (interpreter) free (interpreter); diff --git a/src/plugins/scripts/perl/weechat-perl.h b/src/plugins/scripts/perl/weechat-perl.h index ec75dbc1f..436b8046e 100644 --- a/src/plugins/scripts/perl/weechat-perl.h +++ b/src/plugins/scripts/perl/weechat-perl.h @@ -34,8 +34,11 @@ extern struct t_plugin_script *perl_current_script; extern struct t_plugin_script *perl_registered_script; extern const char *perl_current_script_filename; +extern HV *weechat_perl_hashtable_to_hash (struct t_hashtable *hashtable); +extern struct t_hashtable *weechat_perl_hash_to_hashtable (SV *hash, + int hashtable_size); extern void *weechat_perl_exec (struct t_plugin_script *script, int ret_type, const char *function, - char **argv); + const char *format, void **argv); #endif /* __WEECHAT_PERL_H */ diff --git a/src/plugins/scripts/python/weechat-python-api.c b/src/plugins/scripts/python/weechat-python-api.c index 5f83d4abd..058b449a2 100644 --- a/src/plugins/scripts/python/weechat-python-api.c +++ b/src/plugins/scripts/python/weechat-python-api.c @@ -1064,7 +1064,8 @@ weechat_python_api_config_reload_cb (void *data, struct t_config_file *config_file) { struct t_script_callback *script_callback; - char *python_argv[3], empty_arg[1] = { '\0' }; + void *python_argv[2]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1073,12 +1074,11 @@ weechat_python_api_config_reload_cb (void *data, { python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = script_ptr2str (config_file); - python_argv[2] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "ss", python_argv); if (!rc) ret = WEECHAT_CONFIG_READ_FILE_NOT_FOUND; @@ -1146,7 +1146,8 @@ weechat_python_api_config_read_cb (void *data, const char *option_name, const char *value) { struct t_script_callback *script_callback; - char *python_argv[6], empty_arg[1] = { '\0' }; + void *python_argv[5]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1158,12 +1159,11 @@ weechat_python_api_config_read_cb (void *data, python_argv[2] = script_ptr2str (section); python_argv[3] = (option_name) ? (char *)option_name : empty_arg; python_argv[4] = (value) ? (char *)value : empty_arg; - python_argv[5] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sssss", python_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_SET_ERROR; @@ -1193,7 +1193,8 @@ weechat_python_api_config_section_write_cb (void *data, const char *section_name) { struct t_script_callback *script_callback; - char *python_argv[4], empty_arg[1] = { '\0' }; + void *python_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1203,12 +1204,11 @@ weechat_python_api_config_section_write_cb (void *data, python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = script_ptr2str (config_file); python_argv[2] = (section_name) ? (char *)section_name : empty_arg; - python_argv[3] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sss", python_argv); if (!rc) ret = WEECHAT_CONFIG_WRITE_ERROR; @@ -1237,7 +1237,8 @@ weechat_python_api_config_section_write_default_cb (void *data, const char *section_name) { struct t_script_callback *script_callback; - char *python_argv[4], empty_arg[1] = { '\0' }; + void *python_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1247,12 +1248,11 @@ weechat_python_api_config_section_write_default_cb (void *data, python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = script_ptr2str (config_file); python_argv[2] = (section_name) ? (char *)section_name : empty_arg; - python_argv[3] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sss", python_argv); if (!rc) ret = WEECHAT_CONFIG_WRITE_ERROR; @@ -1282,7 +1282,8 @@ weechat_python_api_config_section_create_option_cb (void *data, const char *value) { struct t_script_callback *script_callback; - char *python_argv[6], empty_arg[1] = { '\0' }; + void *python_argv[5]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1294,12 +1295,11 @@ weechat_python_api_config_section_create_option_cb (void *data, python_argv[2] = script_ptr2str (section); python_argv[3] = (option_name) ? (char *)option_name : empty_arg; python_argv[4] = (value) ? (char *)value : empty_arg; - python_argv[5] = NULL; - + rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sssss", python_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_SET_ERROR; @@ -1330,7 +1330,8 @@ weechat_python_api_config_section_delete_option_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *python_argv[5], empty_arg[1] = { '\0' }; + void *python_argv[4]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1341,12 +1342,11 @@ weechat_python_api_config_section_delete_option_cb (void *data, python_argv[1] = script_ptr2str (config_file); python_argv[2] = script_ptr2str (section); python_argv[3] = script_ptr2str (option); - python_argv[4] = NULL; - + rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "ssss", python_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_UNSET_ERROR; @@ -1488,7 +1488,8 @@ weechat_python_api_config_option_check_value_cb (void *data, const char *value) { struct t_script_callback *script_callback; - char *python_argv[4], empty_arg[1] = { '\0' }; + void *python_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1498,12 +1499,11 @@ weechat_python_api_config_option_check_value_cb (void *data, python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = script_ptr2str (option); python_argv[2] = (value) ? (char *)value : empty_arg; - python_argv[3] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sss", python_argv); if (!rc) ret = 0; @@ -1530,7 +1530,8 @@ weechat_python_api_config_option_change_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *python_argv[3], empty_arg[1] = { '\0' }; + void *python_argv[2]; + char empty_arg[1] = { '\0' }; int *rc; script_callback = (struct t_script_callback *)data; @@ -1539,12 +1540,11 @@ weechat_python_api_config_option_change_cb (void *data, { python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = script_ptr2str (option); - python_argv[2] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "ss", python_argv); if (python_argv[1]) free (python_argv[1]); @@ -1563,7 +1563,8 @@ weechat_python_api_config_option_delete_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *python_argv[3], empty_arg[1] = { '\0' }; + void *python_argv[2]; + char empty_arg[1] = { '\0' }; int *rc; script_callback = (struct t_script_callback *)data; @@ -1572,12 +1573,11 @@ weechat_python_api_config_option_delete_cb (void *data, { python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = script_ptr2str (option); - python_argv[2] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "ss", python_argv); if (python_argv[1]) free (python_argv[1]); @@ -2903,7 +2903,8 @@ weechat_python_api_hook_command_cb (void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { struct t_script_callback *script_callback; - char *python_argv[4], empty_arg[1] = { '\0' }; + void *python_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; /* make C compiler happy */ @@ -2916,12 +2917,11 @@ weechat_python_api_hook_command_cb (void *data, struct t_gui_buffer *buffer, python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = script_ptr2str (buffer); python_argv[2] = (argc > 1) ? argv_eol[1] : empty_arg; - python_argv[3] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -2997,7 +2997,8 @@ weechat_python_api_hook_command_run_cb (void *data, struct t_gui_buffer *buffer, const char *command) { struct t_script_callback *script_callback; - char *python_argv[4], empty_arg[1] = { '\0' }; + void *python_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3007,12 +3008,11 @@ weechat_python_api_hook_command_run_cb (void *data, struct t_gui_buffer *buffer, python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = script_ptr2str (buffer); python_argv[2] = (command) ? (char *)command : empty_arg; - python_argv[3] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3077,7 +3077,8 @@ int weechat_python_api_hook_timer_cb (void *data, int remaining_calls) { struct t_script_callback *script_callback; - char *python_argv[3], str_remaining_calls[32], empty_arg[1] = { '\0' }; + void *python_argv[2]; + char str_remaining_calls[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3089,12 +3090,11 @@ weechat_python_api_hook_timer_cb (void *data, int remaining_calls) python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = str_remaining_calls; - python_argv[2] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "ss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3163,7 +3163,8 @@ int weechat_python_api_hook_fd_cb (void *data, int fd) { struct t_script_callback *script_callback; - char *python_argv[3], str_fd[32], empty_arg[1] = { '\0' }; + void *python_argv[2]; + char str_fd[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3174,12 +3175,11 @@ weechat_python_api_hook_fd_cb (void *data, int fd) python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = str_fd; - python_argv[2] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "ss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3252,7 +3252,8 @@ weechat_python_api_hook_process_cb (void *data, const char *out, const char *err) { struct t_script_callback *script_callback; - char *python_argv[6], str_rc[32], empty_arg[1] = { '\0' }; + void *python_argv[5]; + char str_rc[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3266,12 +3267,11 @@ weechat_python_api_hook_process_cb (void *data, python_argv[2] = str_rc; python_argv[3] = (out) ? (char *)out : empty_arg; python_argv[4] = (err) ? (char *)err : empty_arg; - python_argv[5] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sssss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3338,8 +3338,8 @@ weechat_python_api_hook_connect_cb (void *data, int status, int gnutls_rc, const char *error, const char *ip_address) { struct t_script_callback *script_callback; - char *python_argv[6], str_status[32], str_gnutls_rc[32]; - char empty_arg[1] = { '\0' }; + void *python_argv[5]; + char str_status[32], str_gnutls_rc[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3354,12 +3354,11 @@ weechat_python_api_hook_connect_cb (void *data, int status, int gnutls_rc, python_argv[2] = str_gnutls_rc; python_argv[3] = (ip_address) ? (char *)ip_address : empty_arg; python_argv[4] = (error) ? (char *)error : empty_arg; - python_argv[5] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sssss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3441,7 +3440,8 @@ weechat_python_api_hook_print_cb (void *data, struct t_gui_buffer *buffer, const char *prefix, const char *message) { struct t_script_callback *script_callback; - char *python_argv[9], empty_arg[1] = { '\0' }; + void *python_argv[8]; + char empty_arg[1] = { '\0' }; static char timebuffer[64]; int *rc, ret; @@ -3464,12 +3464,11 @@ weechat_python_api_hook_print_cb (void *data, struct t_gui_buffer *buffer, python_argv[5] = (highlight) ? strdup ("1") : strdup ("0"); python_argv[6] = (prefix) ? (char *)prefix : empty_arg; python_argv[7] = (message) ? (char *)message : empty_arg; - python_argv[8] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "ssssssss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3549,7 +3548,8 @@ weechat_python_api_hook_signal_cb (void *data, const char *signal, const char *t void *signal_data) { struct t_script_callback *script_callback; - char *python_argv[4], empty_arg[1] = { '\0' }; + void *python_argv[3]; + char empty_arg[1] = { '\0' }; static char value_str[64]; int *rc, ret, free_needed; @@ -3577,12 +3577,11 @@ weechat_python_api_hook_signal_cb (void *data, const char *signal, const char *t } else python_argv[2] = empty_arg; - python_argv[3] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3701,7 +3700,8 @@ int weechat_python_api_hook_config_cb (void *data, const char *option, const char *value) { struct t_script_callback *script_callback; - char *python_argv[4], empty_arg[1] = { '\0' }; + void *python_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3711,12 +3711,11 @@ weechat_python_api_hook_config_cb (void *data, const char *option, const char *v python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = (option) ? (char *)option : empty_arg; python_argv[2] = (value) ? (char *)value : empty_arg; - python_argv[3] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3781,7 +3780,8 @@ weechat_python_api_hook_completion_cb (void *data, const char *completion_item, struct t_gui_completion *completion) { struct t_script_callback *script_callback; - char *python_argv[5], empty_arg[1] = { '\0' }; + void *python_argv[4]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3792,12 +3792,11 @@ weechat_python_api_hook_completion_cb (void *data, const char *completion_item, python_argv[1] = (completion_item) ? (char *)completion_item : empty_arg; python_argv[2] = script_ptr2str (buffer); python_argv[3] = script_ptr2str (completion); - python_argv[4] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "ssss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3907,7 +3906,8 @@ weechat_python_api_hook_modifier_cb (void *data, const char *modifier, const char *modifier_data, const char *string) { struct t_script_callback *script_callback; - char *python_argv[5], empty_arg[1] = { '\0' }; + void *python_argv[4]; + char empty_arg[1] = { '\0' }; script_callback = (struct t_script_callback *)data; @@ -3917,12 +3917,11 @@ weechat_python_api_hook_modifier_cb (void *data, const char *modifier, python_argv[1] = (modifier) ? (char *)modifier : empty_arg; python_argv[2] = (modifier_data) ? (char *)modifier_data : empty_arg; python_argv[3] = (string) ? (char *)string : empty_arg; - python_argv[4] = NULL; return (char *)weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - python_argv); + "ssss", python_argv); } return NULL; @@ -4010,7 +4009,8 @@ weechat_python_api_hook_info_cb (void *data, const char *info_name, const char *arguments) { struct t_script_callback *script_callback; - char *python_argv[4], empty_arg[1] = { '\0' }; + void *python_argv[3]; + char empty_arg[1] = { '\0' }; script_callback = (struct t_script_callback *)data; @@ -4019,12 +4019,11 @@ weechat_python_api_hook_info_cb (void *data, const char *info_name, python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = (info_name) ? (char *)info_name : empty_arg; python_argv[2] = (arguments) ? (char *)arguments : empty_arg; - python_argv[3] = NULL; return (const char *)weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - python_argv); + "sss", python_argv); } return NULL; @@ -4075,6 +4074,89 @@ weechat_python_api_hook_info (PyObject *self, PyObject *args) } /* + * weechat_python_api_hook_info_hashtable_cb: callback for info_hashtable hooked + */ + +struct t_hashtable * +weechat_python_api_hook_info_hashtable_cb (void *data, const char *info_name, + struct t_hashtable *hashtable) +{ + struct t_script_callback *script_callback; + void *python_argv[3]; + char empty_arg[1] = { '\0' }; + struct t_hashtable *ret_hashtable; + + script_callback = (struct t_script_callback *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + python_argv[1] = (info_name) ? (char *)info_name : empty_arg; + python_argv[2] = weechat_python_hashtable_to_dict (hashtable); + + ret_hashtable = weechat_python_exec (script_callback->script, + WEECHAT_SCRIPT_EXEC_HASHTABLE, + script_callback->function, + "ssO", python_argv); + + if (python_argv[2]) + Py_XDECREF(python_argv[2]); + + return ret_hashtable; + } + + return NULL; +} + +/* + * weechat_python_api_hook_info_hashtable: hook an info_hashtable + */ + +static PyObject * +weechat_python_api_hook_info_hashtable (PyObject *self, PyObject *args) +{ + char *info_name, *description, *args_description, *output_description; + char *function, *data, *result; + PyObject *object; + + /* make C compiler happy */ + (void) self; + + if (!python_current_script) + { + WEECHAT_SCRIPT_MSG_NOT_INIT(PYTHON_CURRENT_SCRIPT_NAME, "hook_info_hashtable"); + PYTHON_RETURN_EMPTY; + } + + info_name = NULL; + description = NULL; + args_description = NULL; + output_description = NULL; + function = NULL; + data = NULL; + + if (!PyArg_ParseTuple (args, "ssssss", &info_name, &description, + &args_description, &output_description, + &function, &data)) + { + WEECHAT_SCRIPT_MSG_WRONG_ARGS(PYTHON_CURRENT_SCRIPT_NAME, "hook_info_hashtable"); + PYTHON_RETURN_EMPTY; + } + + result = script_ptr2str(script_api_hook_info_hashtable (weechat_python_plugin, + python_current_script, + info_name, + description, + args_description, + output_description, + &weechat_python_api_hook_info_hashtable_cb, + function, + data)); + + PYTHON_RETURN_STRING_FREE(result); +} + +/* * weechat_python_api_hook_infolist_cb: callback for infolist hooked */ @@ -4083,7 +4165,8 @@ weechat_python_api_hook_infolist_cb (void *data, const char *infolist_name, void *pointer, const char *arguments) { struct t_script_callback *script_callback; - char *python_argv[5], empty_arg[1] = { '\0' }; + void *python_argv[4]; + char empty_arg[1] = { '\0' }; struct t_infolist *result; script_callback = (struct t_script_callback *)data; @@ -4094,12 +4177,11 @@ weechat_python_api_hook_infolist_cb (void *data, const char *infolist_name, python_argv[1] = (infolist_name) ? (char *)infolist_name : empty_arg; python_argv[2] = script_ptr2str (pointer); python_argv[3] = (arguments) ? (char *)arguments : empty_arg; - python_argv[4] = NULL; result = (struct t_infolist *)weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - python_argv); + "ssss", python_argv); if (python_argv[2]) free (python_argv[2]); @@ -4222,7 +4304,8 @@ weechat_python_api_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer const char *input_data) { struct t_script_callback *script_callback; - char *python_argv[4], empty_arg[1] = { '\0' }; + void *python_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4232,12 +4315,11 @@ weechat_python_api_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = script_ptr2str (buffer); python_argv[2] = (input_data) ? (char *)input_data : empty_arg; - python_argv[3] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "sss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; else @@ -4262,7 +4344,8 @@ int weechat_python_api_buffer_close_cb (void *data, struct t_gui_buffer *buffer) { struct t_script_callback *script_callback; - char *python_argv[3], empty_arg[1] = { '\0' }; + void *python_argv[2]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4271,12 +4354,11 @@ weechat_python_api_buffer_close_cb (void *data, struct t_gui_buffer *buffer) { python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = script_ptr2str (buffer); - python_argv[2] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "ss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; else @@ -5177,7 +5259,8 @@ weechat_python_api_bar_item_build_cb (void *data, struct t_gui_bar_item *item, struct t_gui_window *window) { struct t_script_callback *script_callback; - char *python_argv[4], empty_arg[1] = { '\0' }, *ret; + void *python_argv[3]; + char empty_arg[1] = { '\0' }, *ret; script_callback = (struct t_script_callback *)data; @@ -5186,12 +5269,11 @@ weechat_python_api_bar_item_build_cb (void *data, struct t_gui_bar_item *item, python_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; python_argv[1] = script_ptr2str (item); python_argv[2] = script_ptr2str (window); - python_argv[3] = NULL; ret = (char *)weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - python_argv); + "sss", python_argv); if (python_argv[1]) free (python_argv[1]); @@ -5537,7 +5619,7 @@ weechat_python_api_command (PyObject *self, PyObject *args) } /* - * weechat_python_api_info_get: get info about WeeChat + * weechat_python_api_info_get: get info (as string) */ static PyObject * @@ -5569,6 +5651,47 @@ weechat_python_api_info_get (PyObject *self, PyObject *args) } /* + * weechat_python_api_info_get_hashtable: get info (as hashtable) + */ + +static PyObject * +weechat_python_api_info_get_hashtable (PyObject *self, PyObject *args) +{ + char *info_name; + struct t_hashtable *hashtable, *result_hashtable; + PyObject *dict, *result_dict; + + /* make C compiler happy */ + (void) self; + + if (!python_current_script) + { + WEECHAT_SCRIPT_MSG_NOT_INIT(PYTHON_CURRENT_SCRIPT_NAME, "info_get_hashtable"); + PYTHON_RETURN_EMPTY; + } + + info_name = NULL; + + if (!PyArg_ParseTuple (args, "sO", &info_name, &dict)) + { + WEECHAT_SCRIPT_MSG_WRONG_ARGS(PYTHON_CURRENT_SCRIPT_NAME, "info_get_hashtable"); + PYTHON_RETURN_EMPTY; + } + hashtable = weechat_python_dict_to_hashtable (dict, + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE); + + result_hashtable = weechat_info_get_hashtable (info_name, hashtable); + result_dict = weechat_python_hashtable_to_dict (result_hashtable); + + if (hashtable) + weechat_hashtable_free (hashtable); + if (result_hashtable) + weechat_hashtable_free (result_hashtable); + + return result_dict; +} + +/* * weechat_python_api_infolist_new: create new infolist */ @@ -6158,7 +6281,8 @@ weechat_python_api_upgrade_read_cb (void *data, struct t_infolist *infolist) { struct t_script_callback *script_callback; - char *python_argv[5], empty_arg[1] = { '\0' }, str_object_id[32]; + void *python_argv[4]; + char empty_arg[1] = { '\0' }, str_object_id[32]; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -6171,12 +6295,11 @@ weechat_python_api_upgrade_read_cb (void *data, python_argv[1] = script_ptr2str (upgrade_file); python_argv[2] = str_object_id; python_argv[3] = script_ptr2str (infolist); - python_argv[4] = NULL; rc = (int *) weechat_python_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - python_argv); + "ssss", python_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -6357,6 +6480,7 @@ PyMethodDef weechat_python_funcs[] = { "hook_modifier", &weechat_python_api_hook_modifier, METH_VARARGS, "" }, { "hook_modifier_exec", &weechat_python_api_hook_modifier_exec, METH_VARARGS, "" }, { "hook_info", &weechat_python_api_hook_info, METH_VARARGS, "" }, + { "hook_info_hashtable", &weechat_python_api_hook_info_hashtable, METH_VARARGS, "" }, { "hook_infolist", &weechat_python_api_hook_infolist, METH_VARARGS, "" }, { "unhook", &weechat_python_api_unhook, METH_VARARGS, "" }, { "unhook_all", &weechat_python_api_unhook_all, METH_VARARGS, "" }, @@ -6396,6 +6520,7 @@ PyMethodDef weechat_python_funcs[] = { "bar_remove", &weechat_python_api_bar_remove, METH_VARARGS, "" }, { "command", &weechat_python_api_command, METH_VARARGS, "" }, { "info_get", &weechat_python_api_info_get, METH_VARARGS, "" }, + { "info_get_hashtable", &weechat_python_api_info_get_hashtable, METH_VARARGS, "" }, { "infolist_new", &weechat_python_api_infolist_new, METH_VARARGS, "" }, { "infolist_new_item", &weechat_python_api_infolist_new_item, METH_VARARGS, "" }, { "infolist_new_var_integer", &weechat_python_api_infolist_new_var_integer, METH_VARARGS, "" }, diff --git a/src/plugins/scripts/python/weechat-python.c b/src/plugins/scripts/python/weechat-python.c index 110bbe0cf..fabe584da 100644 --- a/src/plugins/scripts/python/weechat-python.c +++ b/src/plugins/scripts/python/weechat-python.c @@ -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); } diff --git a/src/plugins/scripts/python/weechat-python.h b/src/plugins/scripts/python/weechat-python.h index 9a456401f..ad80fa2b6 100644 --- a/src/plugins/scripts/python/weechat-python.h +++ b/src/plugins/scripts/python/weechat-python.h @@ -35,8 +35,11 @@ extern struct t_plugin_script *python_current_script; extern struct t_plugin_script *python_registered_script; extern const char *python_current_script_filename; +extern PyObject *weechat_python_hashtable_to_dict (struct t_hashtable *hashtable); +extern struct t_hashtable *weechat_python_dict_to_hashtable (PyObject *dict, + int hashtable_size); extern void *weechat_python_exec (struct t_plugin_script *script, int ret_type, const char *function, - char **argv); + char *format, void **argv); #endif /* __WEECHAT_PYTHON_H */ diff --git a/src/plugins/scripts/ruby/weechat-ruby-api.c b/src/plugins/scripts/ruby/weechat-ruby-api.c index 0e52378a5..f06d5b758 100644 --- a/src/plugins/scripts/ruby/weechat-ruby-api.c +++ b/src/plugins/scripts/ruby/weechat-ruby-api.c @@ -1224,7 +1224,8 @@ weechat_ruby_api_config_reload_cb (void *data, struct t_config_file *config_file) { struct t_script_callback *script_callback; - char *ruby_argv[3], empty_arg[1] = { '\0' }; + void *ruby_argv[2]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1233,12 +1234,11 @@ weechat_ruby_api_config_reload_cb (void *data, { ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = script_ptr2str (config_file); - ruby_argv[2] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "ss", ruby_argv); if (!rc) ret = WEECHAT_CONFIG_READ_FILE_NOT_FOUND; @@ -1315,7 +1315,8 @@ weechat_ruby_api_config_read_cb (void *data, const char *option_name, const char *value) { struct t_script_callback *script_callback; - char *ruby_argv[6], empty_arg[1] = { '\0' }; + void *ruby_argv[5]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1327,12 +1328,11 @@ weechat_ruby_api_config_read_cb (void *data, ruby_argv[2] = script_ptr2str (section); ruby_argv[3] = (option_name) ? (char *)option_name : empty_arg; ruby_argv[4] = (value) ? (char *)value : empty_arg; - ruby_argv[5] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sssss", ruby_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_SET_ERROR; @@ -1362,7 +1362,8 @@ weechat_ruby_api_config_section_write_cb (void *data, const char *section_name) { struct t_script_callback *script_callback; - char *ruby_argv[4], empty_arg[1] = { '\0' }; + void *ruby_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1372,12 +1373,11 @@ weechat_ruby_api_config_section_write_cb (void *data, ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = script_ptr2str (config_file); ruby_argv[2] = (section_name) ? (char *)section_name : empty_arg; - ruby_argv[3] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sss", ruby_argv); if (!rc) ret = WEECHAT_CONFIG_WRITE_ERROR; @@ -1406,7 +1406,8 @@ weechat_ruby_api_config_section_write_default_cb (void *data, const char *section_name) { struct t_script_callback *script_callback; - char *ruby_argv[4], empty_arg[1] = { '\0' }; + void *ruby_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1416,12 +1417,11 @@ weechat_ruby_api_config_section_write_default_cb (void *data, ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = script_ptr2str (config_file); ruby_argv[2] = (section_name) ? (char *)section_name : empty_arg; - ruby_argv[3] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sss", ruby_argv); if (!rc) ret = WEECHAT_CONFIG_WRITE_ERROR; @@ -1451,7 +1451,8 @@ weechat_ruby_api_config_section_create_option_cb (void *data, const char *value) { struct t_script_callback *script_callback; - char *ruby_argv[6], empty_arg[1] = { '\0' }; + void *ruby_argv[5]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1463,12 +1464,11 @@ weechat_ruby_api_config_section_create_option_cb (void *data, ruby_argv[2] = script_ptr2str (section); ruby_argv[3] = (option_name) ? (char *)option_name : empty_arg; ruby_argv[4] = (value) ? (char *)value : empty_arg; - ruby_argv[5] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sssss", ruby_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_SET_ERROR; @@ -1499,7 +1499,8 @@ weechat_ruby_api_config_section_delete_option_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *ruby_argv[5], empty_arg[1] = { '\0' }; + void *ruby_argv[4]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1510,12 +1511,11 @@ weechat_ruby_api_config_section_delete_option_cb (void *data, ruby_argv[1] = script_ptr2str (config_file); ruby_argv[2] = script_ptr2str (section); ruby_argv[3] = script_ptr2str (option); - ruby_argv[4] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "ssss", ruby_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_UNSET_ERROR; @@ -1706,7 +1706,8 @@ weechat_ruby_api_config_option_check_value_cb (void *data, const char *value) { struct t_script_callback *script_callback; - char *ruby_argv[4], empty_arg[1] = { '\0' }; + void *ruby_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1716,12 +1717,11 @@ weechat_ruby_api_config_option_check_value_cb (void *data, ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = script_ptr2str (option); ruby_argv[2] = (value) ? (char *)value : empty_arg; - ruby_argv[3] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sss", ruby_argv); if (!rc) ret = 0; @@ -1748,7 +1748,8 @@ weechat_ruby_api_config_option_change_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *ruby_argv[3], empty_arg[1] = { '\0' }; + void *ruby_argv[2]; + char empty_arg[1] = { '\0' }; int *rc; script_callback = (struct t_script_callback *)data; @@ -1757,12 +1758,11 @@ weechat_ruby_api_config_option_change_cb (void *data, { ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = script_ptr2str (option); - ruby_argv[2] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "ss", ruby_argv); if (ruby_argv[1]) free (ruby_argv[1]); @@ -1781,7 +1781,8 @@ weechat_ruby_api_config_option_delete_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *ruby_argv[3], empty_arg[1] = { '\0' }; + void *ruby_argv[2]; + char empty_arg[1] = { '\0' }; int *rc; script_callback = (struct t_script_callback *)data; @@ -1790,12 +1791,11 @@ weechat_ruby_api_config_option_delete_cb (void *data, { ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = script_ptr2str (option); - ruby_argv[2] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "ss", ruby_argv); if (ruby_argv[1]) free (ruby_argv[1]); @@ -3348,7 +3348,8 @@ weechat_ruby_api_hook_command_cb (void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { struct t_script_callback *script_callback; - char *ruby_argv[4], empty_arg[1] = { '\0' }; + void *ruby_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; /* make C compiler happy */ @@ -3361,12 +3362,11 @@ weechat_ruby_api_hook_command_cb (void *data, struct t_gui_buffer *buffer, ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = script_ptr2str (buffer); ruby_argv[2] = (argc > 1) ? argv_eol[1] : empty_arg; - ruby_argv[3] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3461,7 +3461,8 @@ weechat_ruby_api_hook_command_run_cb (void *data, struct t_gui_buffer *buffer, const char *command) { struct t_script_callback *script_callback; - char *ruby_argv[4], empty_arg[1] = { '\0' }; + void *ruby_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3471,12 +3472,11 @@ weechat_ruby_api_hook_command_run_cb (void *data, struct t_gui_buffer *buffer, ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = script_ptr2str (buffer); ruby_argv[2] = (command) ? (char *)command : empty_arg; - ruby_argv[3] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3550,7 +3550,8 @@ int weechat_ruby_api_hook_timer_cb (void *data, int remaining_calls) { struct t_script_callback *script_callback; - char *ruby_argv[3], str_remaining_calls[32], empty_arg[1] = { '\0' }; + void *ruby_argv[2]; + char str_remaining_calls[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3562,12 +3563,11 @@ weechat_ruby_api_hook_timer_cb (void *data, int remaining_calls) ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = str_remaining_calls; - ruby_argv[2] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "ss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3649,7 +3649,8 @@ int weechat_ruby_api_hook_fd_cb (void *data, int fd) { struct t_script_callback *script_callback; - char *ruby_argv[3], str_fd[32], empty_arg[1] = { '\0' }; + void *ruby_argv[2]; + char str_fd[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3660,12 +3661,11 @@ weechat_ruby_api_hook_fd_cb (void *data, int fd) ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = str_fd; - ruby_argv[2] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "ss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3753,7 +3753,8 @@ weechat_ruby_api_hook_process_cb (void *data, const char *out, const char *err) { struct t_script_callback *script_callback; - char *ruby_argv[6], str_rc[32], empty_arg[1] = { '\0' }; + void *ruby_argv[5]; + char str_rc[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3767,12 +3768,11 @@ weechat_ruby_api_hook_process_cb (void *data, ruby_argv[2] = str_rc; ruby_argv[3] = (out) ? (char *)out : empty_arg; ruby_argv[4] = (err) ? (char *)err : empty_arg; - ruby_argv[5] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sssss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3850,7 +3850,8 @@ weechat_ruby_api_hook_connect_cb (void *data, int status, int gnutls_rc, const char *error, const char *ip_address) { struct t_script_callback *script_callback; - char *ruby_argv[6], str_status[32], str_gnutls_rc[32]; + void *ruby_argv[5]; + char str_status[32], str_gnutls_rc[32]; char empty_arg[1] = { '\0' }; int *rc, ret; @@ -3866,12 +3867,11 @@ weechat_ruby_api_hook_connect_cb (void *data, int status, int gnutls_rc, ruby_argv[2] = str_gnutls_rc; ruby_argv[3] = (ip_address) ? (char *)ip_address : empty_arg; ruby_argv[4] = (error) ? (char *)error : empty_arg; - ruby_argv[5] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sssss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3975,7 +3975,8 @@ weechat_ruby_api_hook_print_cb (void *data, struct t_gui_buffer *buffer, const char *prefix, const char *message) { struct t_script_callback *script_callback; - char *ruby_argv[9], empty_arg[1] = { '\0' }; + void *ruby_argv[8]; + char empty_arg[1] = { '\0' }; static char timebuffer[64]; int *rc, ret; @@ -3998,12 +3999,11 @@ weechat_ruby_api_hook_print_cb (void *data, struct t_gui_buffer *buffer, ruby_argv[5] = (highlight) ? strdup ("1") : strdup ("0"); ruby_argv[6] = (prefix) ? (char *)prefix : empty_arg; ruby_argv[7] = (message) ? (char *)message : empty_arg; - ruby_argv[8] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "ssssssss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -4099,7 +4099,8 @@ weechat_ruby_api_hook_signal_cb (void *data, const char *signal, const char *typ void *signal_data) { struct t_script_callback *script_callback; - char *ruby_argv[4], empty_arg[1] = { '\0' }; + void *ruby_argv[3]; + char empty_arg[1] = { '\0' }; static char value_str[64]; int *rc, ret, free_needed; @@ -4127,12 +4128,11 @@ weechat_ruby_api_hook_signal_cb (void *data, const char *signal, const char *typ } else ruby_argv[2] = empty_arg; - ruby_argv[3] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -4268,7 +4268,8 @@ int weechat_ruby_api_hook_config_cb (void *data, const char *option, const char *value) { struct t_script_callback *script_callback; - char *ruby_argv[4], empty_arg[1] = { '\0' }; + void *ruby_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4278,12 +4279,11 @@ weechat_ruby_api_hook_config_cb (void *data, const char *option, const char *val ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = (option) ? (char *)option : empty_arg; ruby_argv[2] = (value) ? (char *)value : empty_arg; - ruby_argv[3] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -4357,7 +4357,8 @@ weechat_ruby_api_hook_completion_cb (void *data, const char *completion_item, struct t_gui_completion *completion) { struct t_script_callback *script_callback; - char *ruby_argv[5], empty_arg[1] = { '\0' }; + void *ruby_argv[4]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4368,12 +4369,11 @@ weechat_ruby_api_hook_completion_cb (void *data, const char *completion_item, ruby_argv[1] = (completion_item) ? (char *)completion_item : empty_arg; ruby_argv[2] = script_ptr2str (buffer); ruby_argv[3] = script_ptr2str (completion); - ruby_argv[4] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "ssss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -4507,7 +4507,8 @@ weechat_ruby_api_hook_modifier_cb (void *data, const char *modifier, const char *modifier_data, const char *string) { struct t_script_callback *script_callback; - char *ruby_argv[5], empty_arg[1] = { '\0' }; + void *ruby_argv[4]; + char empty_arg[1] = { '\0' }; script_callback = (struct t_script_callback *)data; @@ -4517,12 +4518,11 @@ weechat_ruby_api_hook_modifier_cb (void *data, const char *modifier, ruby_argv[1] = (modifier) ? (char *)modifier : empty_arg; ruby_argv[2] = (modifier_data) ? (char *)modifier_data : empty_arg; ruby_argv[3] = (string) ? (char *)string : empty_arg; - ruby_argv[4] = NULL; return (char *)weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - ruby_argv); + "ssss", ruby_argv); } return NULL; @@ -4628,7 +4628,8 @@ weechat_ruby_api_hook_info_cb (void *data, const char *info_name, const char *arguments) { struct t_script_callback *script_callback; - char *ruby_argv[4], empty_arg[1] = { '\0' }; + void *ruby_argv[3]; + char empty_arg[1] = { '\0' }; script_callback = (struct t_script_callback *)data; @@ -4637,12 +4638,11 @@ weechat_ruby_api_hook_info_cb (void *data, const char *info_name, ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = (info_name) ? (char *)info_name : empty_arg; ruby_argv[2] = (arguments) ? (char *)arguments : empty_arg; - ruby_argv[3] = NULL; return (const char *)weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - ruby_argv); + "sss", ruby_argv); } return NULL; @@ -4707,6 +4707,101 @@ weechat_ruby_api_hook_info (VALUE class, VALUE info_name, VALUE description, } /* + * weechat_ruby_api_hook_info_hashtable_cb: callback for info_hashtable hooked + */ + +struct t_hashtable * +weechat_ruby_api_hook_info_hashtable_cb (void *data, const char *info_name, + struct t_hashtable *hashtable) +{ + struct t_script_callback *script_callback; + void *ruby_argv[3]; + char empty_arg[1] = { '\0' }; + + script_callback = (struct t_script_callback *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + ruby_argv[1] = (info_name) ? (char *)info_name : empty_arg; + ruby_argv[2] = (void *)weechat_ruby_hashtable_to_hash (hashtable); + + return (struct t_hashtable *)weechat_ruby_exec (script_callback->script, + WEECHAT_SCRIPT_EXEC_HASHTABLE, + script_callback->function, + "ssh", ruby_argv); + } + + return NULL; +} + +/* + * weechat_ruby_api_hook_info_hashtable: hook an info_hashtable + */ + +static VALUE +weechat_ruby_api_hook_info_hashtable (VALUE class, VALUE info_name, + VALUE description, + VALUE args_description, + VALUE output_description, + VALUE function, VALUE data) +{ + char *c_info_name, *c_description, *c_args_description; + char *c_output_description, *c_function; + char *c_data, *result; + VALUE return_value; + + /* make C compiler happy */ + (void) class; + + if (!ruby_current_script) + { + WEECHAT_SCRIPT_MSG_NOT_INIT(RUBY_CURRENT_SCRIPT_NAME, "hook_info_hashtable"); + RUBY_RETURN_EMPTY; + } + + c_info_name = NULL; + c_description = NULL; + c_args_description = NULL; + c_output_description = NULL; + c_function = NULL; + c_data = NULL; + + if (NIL_P (info_name) || NIL_P (description) || NIL_P (args_description) + || NIL_P (output_description) || NIL_P (function) || NIL_P (data)) + { + WEECHAT_SCRIPT_MSG_WRONG_ARGS(RUBY_CURRENT_SCRIPT_NAME, "hook_info_hashtable"); + RUBY_RETURN_EMPTY; + } + + Check_Type (info_name, T_STRING); + Check_Type (description, T_STRING); + Check_Type (args_description, T_STRING); + Check_Type (output_description, T_STRING); + Check_Type (function, T_STRING); + Check_Type (data, T_STRING); + + c_info_name = STR2CSTR (info_name); + c_description = STR2CSTR (description); + c_args_description = STR2CSTR (args_description); + c_output_description = STR2CSTR (output_description); + c_function = STR2CSTR (function); + c_data = STR2CSTR (data); + + result = script_ptr2str (script_api_hook_info_hashtable (weechat_ruby_plugin, + ruby_current_script, + c_info_name, + c_description, + c_args_description, + c_output_description, + &weechat_ruby_api_hook_info_hashtable_cb, + c_function, + c_data)); + + RUBY_RETURN_STRING_FREE(result); +} + +/* * weechat_ruby_api_hook_infolist_cb: callback for infolist hooked */ @@ -4715,7 +4810,8 @@ weechat_ruby_api_hook_infolist_cb (void *data, const char *infolist_name, void *pointer, const char *arguments) { struct t_script_callback *script_callback; - char *ruby_argv[5], empty_arg[1] = { '\0' }; + void *ruby_argv[4]; + char empty_arg[1] = { '\0' }; struct t_infolist *result; script_callback = (struct t_script_callback *)data; @@ -4726,12 +4822,11 @@ weechat_ruby_api_hook_infolist_cb (void *data, const char *infolist_name, ruby_argv[1] = (infolist_name) ? (char *)infolist_name : empty_arg; ruby_argv[2] = script_ptr2str (pointer); ruby_argv[3] = (arguments) ? (char *)arguments : empty_arg; - ruby_argv[4] = NULL; result = (struct t_infolist *)weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - ruby_argv); + "ssss", ruby_argv); if (ruby_argv[2]) free (ruby_argv[2]); @@ -4874,7 +4969,8 @@ weechat_ruby_api_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer, const char *input_data) { struct t_script_callback *script_callback; - char *ruby_argv[4], empty_arg[1] = { '\0' }; + void *ruby_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4884,12 +4980,11 @@ weechat_ruby_api_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer, ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = script_ptr2str (buffer); ruby_argv[2] = (input_data) ? (char *)input_data : empty_arg; - ruby_argv[3] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "sss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -4915,7 +5010,8 @@ int weechat_ruby_api_buffer_close_cb (void *data, struct t_gui_buffer *buffer) { struct t_script_callback *script_callback; - char *ruby_argv[3], empty_arg[1] = { '\0' }; + void *ruby_argv[2]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4924,12 +5020,11 @@ weechat_ruby_api_buffer_close_cb (void *data, struct t_gui_buffer *buffer) { ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = script_ptr2str (buffer); - ruby_argv[2] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "ss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -5965,7 +6060,8 @@ weechat_ruby_api_bar_item_build_cb (void *data, struct t_gui_bar_item *item, struct t_gui_window *window) { struct t_script_callback *script_callback; - char *ruby_argv[4], empty_arg[1] = { '\0' }, *ret; + void *ruby_argv[3]; + char empty_arg[1] = { '\0' }, *ret; script_callback = (struct t_script_callback *)data; @@ -5974,12 +6070,11 @@ weechat_ruby_api_bar_item_build_cb (void *data, struct t_gui_bar_item *item, ruby_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; ruby_argv[1] = script_ptr2str (item); ruby_argv[2] = script_ptr2str (window); - ruby_argv[3] = NULL; ret = (char *)weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - ruby_argv); + "sss", ruby_argv); if (ruby_argv[1]) free (ruby_argv[1]); @@ -6392,7 +6487,7 @@ weechat_ruby_api_command (VALUE class, VALUE buffer, VALUE command) } /* - * weechat_ruby_api_info_get: get info about WeeChat + * weechat_ruby_api_info_get: get info (as string) */ static VALUE @@ -6428,6 +6523,51 @@ weechat_ruby_api_info_get (VALUE class, VALUE info_name, VALUE arguments) } /* + * weechat_ruby_api_info_get_hashtable: get info (as hashtable) + */ + +static VALUE +weechat_ruby_api_info_get_hashtable (VALUE class, VALUE info_name, + VALUE hash) +{ + char *c_info_name; + struct t_hashtable *c_hashtable, *result_hashtable; + VALUE result_hash; + + /* make C compiler happy */ + (void) class; + + if (!ruby_current_script) + { + WEECHAT_SCRIPT_MSG_NOT_INIT(RUBY_CURRENT_SCRIPT_NAME, "info_get_hashtable"); + RUBY_RETURN_EMPTY; + } + + if (NIL_P (info_name) || NIL_P (hash)) + { + WEECHAT_SCRIPT_MSG_WRONG_ARGS(RUBY_CURRENT_SCRIPT_NAME, "info_get_hashtable"); + RUBY_RETURN_EMPTY; + } + + Check_Type (info_name, T_STRING); + Check_Type (hash, T_HASH); + + c_info_name = STR2CSTR (info_name); + c_hashtable = weechat_ruby_hash_to_hashtable (hash, + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE); + + result_hashtable = weechat_info_get_hashtable (c_info_name, c_hashtable); + result_hash = weechat_ruby_hashtable_to_hash (result_hashtable); + + if (c_hashtable) + weechat_hashtable_free (c_hashtable); + if (result_hashtable) + weechat_hashtable_free (result_hashtable); + + return result_hash; +} + +/* * weechat_ruby_api_infolist_new: create new infolist */ @@ -7070,7 +7210,8 @@ weechat_ruby_api_upgrade_read_cb (void *data, struct t_infolist *infolist) { struct t_script_callback *script_callback; - char *ruby_argv[5], empty_arg[1] = { '\0' }, str_object_id[32]; + void *ruby_argv[4]; + char empty_arg[1] = { '\0' }, str_object_id[32]; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -7083,12 +7224,11 @@ weechat_ruby_api_upgrade_read_cb (void *data, ruby_argv[1] = script_ptr2str (upgrade_file); ruby_argv[2] = str_object_id; ruby_argv[3] = script_ptr2str (infolist); - ruby_argv[4] = NULL; rc = (int *) weechat_ruby_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - ruby_argv); + "ssss", ruby_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -7326,6 +7466,7 @@ weechat_ruby_api_init (VALUE ruby_mWeechat) rb_define_module_function (ruby_mWeechat, "hook_modifier", &weechat_ruby_api_hook_modifier, 3); rb_define_module_function (ruby_mWeechat, "hook_modifier_exec", &weechat_ruby_api_hook_modifier_exec, 3); rb_define_module_function (ruby_mWeechat, "hook_info", &weechat_ruby_api_hook_info, 5); + rb_define_module_function (ruby_mWeechat, "hook_info_hashtable", &weechat_ruby_api_hook_info_hashtable, 6); rb_define_module_function (ruby_mWeechat, "hook_infolist", &weechat_ruby_api_hook_infolist, 6); rb_define_module_function (ruby_mWeechat, "unhook", &weechat_ruby_api_unhook, 1); rb_define_module_function (ruby_mWeechat, "unhook_all", &weechat_ruby_api_unhook_all, 0); @@ -7365,6 +7506,7 @@ weechat_ruby_api_init (VALUE ruby_mWeechat) rb_define_module_function (ruby_mWeechat, "bar_remove", &weechat_ruby_api_bar_remove, 1); rb_define_module_function (ruby_mWeechat, "command", &weechat_ruby_api_command, 2); rb_define_module_function (ruby_mWeechat, "info_get", &weechat_ruby_api_info_get, 2); + rb_define_module_function (ruby_mWeechat, "info_get_hashtable", &weechat_ruby_api_info_get_hashtable, 2); rb_define_module_function (ruby_mWeechat, "infolist_new", &weechat_ruby_api_infolist_new, 0); rb_define_module_function (ruby_mWeechat, "infolist_new_item", &weechat_ruby_api_infolist_new_item, 1); rb_define_module_function (ruby_mWeechat, "infolist_new_var_integer", &weechat_ruby_api_infolist_new_var_integer, 3); diff --git a/src/plugins/scripts/ruby/weechat-ruby.c b/src/plugins/scripts/ruby/weechat-ruby.c index ffaf816d2..127e7fa21 100644 --- a/src/plugins/scripts/ruby/weechat-ruby.c +++ b/src/plugins/scripts/ruby/weechat-ruby.c @@ -102,6 +102,88 @@ typedef struct protect_call_arg { /* + * weechat_ruby_hashtable_map_cb: callback called for each key/value in a + * hashtable + */ + +void +weechat_ruby_hashtable_map_cb (void *data, + struct t_hashtable *hashtable, + const void *key, + const void *value) +{ + VALUE *hash; + + /* make C compiler happy */ + (void) hashtable; + + hash = (VALUE *)data; + + rb_hash_aset (hash[0], rb_str_new2 ((char *)key), rb_str_new2 ((char *)value)); +} + +/* + * weechat_ruby_hashtable_to_hash: get ruby hash with a WeeChat hashtable + */ + +VALUE +weechat_ruby_hashtable_to_hash (struct t_hashtable *hashtable) +{ + VALUE hash; + + hash = rb_hash_new (); + if (NIL_P (hash)) + return Qnil; + + weechat_hashtable_map (hashtable, + &weechat_ruby_hashtable_map_cb, + &hash); + + return hash; +} + +int +weechat_ruby_hash_foreach_cb (VALUE key, VALUE value, void *arg) +{ + struct t_hashtable *hashtable; + + hashtable = (struct t_hashtable *)arg; + if ((TYPE(key) == T_STRING) && (TYPE(value) == T_STRING)) + { + weechat_hashtable_set (hashtable, STR2CSTR(key), STR2CSTR(value)); + } + return 0; +} + +/* + * weechat_ruby_hash_to_hashtable: get WeeChat hashtable with ruby hashtable + * 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_ruby_hash_to_hashtable (VALUE hash, int hashtable_size) +{ + struct t_hashtable *hashtable; + struct st_table *st; + + hashtable = weechat_hashtable_new (hashtable_size, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + if (!hashtable) + return NULL; + + st = RHASH_TBL(hash); + rb_hash_foreach (hash, &weechat_ruby_hash_foreach_cb, (unsigned long)hashtable); + + return hashtable; +} + +/* * protect_funcall0 : used to protect a function call */ @@ -115,32 +197,19 @@ protect_funcall0 (VALUE arg) } /* - * rb_protect_funcall : function call in protect mode + * rb_protect_funcall: function call in protect mode */ VALUE -rb_protect_funcall (VALUE recv, ID mid, int *state, int argc, ...) +rb_protect_funcall (VALUE recv, ID mid, int *state, int argc, VALUE *argv) { - va_list ap; - VALUE *argv; struct protect_call_arg arg; - - if (argc > 0) - { - int i; - argv = ALLOCA_N(VALUE, argc); - va_start(ap, argc); - for (i = 0; i < argc; i++) - argv[i] = va_arg(ap, VALUE); - va_end(ap); - } - else - argv = 0; + arg.recv = recv; arg.mid = mid; arg.argc = argc; arg.argv = argv; - return rb_protect(protect_funcall0, (VALUE) &arg, state); + return rb_protect (protect_funcall0, (VALUE) &arg, state); } /* @@ -159,13 +228,13 @@ weechat_ruby_print_exception (VALUE err) char* err_class; backtrace = rb_protect_funcall (err, rb_intern("backtrace"), - &ruby_error, 0); + &ruby_error, 0, NULL); err_msg = STR2CSTR(rb_protect_funcall(err, rb_intern("message"), - &ruby_error, 0)); + &ruby_error, 0, NULL)); err_class = STR2CSTR(rb_protect_funcall(rb_protect_funcall(err, rb_intern("class"), - &ruby_error, 0), - rb_intern("name"), &ruby_error, 0)); + &ruby_error, 0, NULL), + rb_intern("name"), &ruby_error, 0, NULL)); if (strcmp (err_class, "SyntaxError") == 0) { @@ -222,122 +291,55 @@ weechat_ruby_print_exception (VALUE err) } /* - * weechat_ruby_exec: call a ruby command + * weechat_ruby_exec: execute a ruby function */ void * weechat_ruby_exec (struct t_plugin_script *script, - int ret_type, const char *function, char **argv) + int ret_type, const char *function, + const char *format, void **argv) { VALUE rc, err; - int ruby_error, *ret_i; + int ruby_error, i, argc, *ret_i; + VALUE argv2[16]; void *ret_value; struct t_plugin_script *old_ruby_current_script; - + old_ruby_current_script = ruby_current_script; ruby_current_script = script; - if (argv && argv[0]) + argc = 0; + if (format && format[0]) { - if (argv[1]) + argc = strlen (format); + for (i = 0; i < argc; i++) { - if (argv[2]) - { - if (argv[3]) - { - if (argv[4]) - { - if (argv[5]) - { - if (argv[6]) - { - if (argv[7]) - { - rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), - &ruby_error, 8, - rb_str_new2(argv[0]), - rb_str_new2(argv[1]), - rb_str_new2(argv[2]), - rb_str_new2(argv[3]), - rb_str_new2(argv[4]), - rb_str_new2(argv[5]), - rb_str_new2(argv[6]), - rb_str_new2(argv[7])); - } - else - { - rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), - &ruby_error, 7, - rb_str_new2(argv[0]), - rb_str_new2(argv[1]), - rb_str_new2(argv[2]), - rb_str_new2(argv[3]), - rb_str_new2(argv[4]), - rb_str_new2(argv[5]), - rb_str_new2(argv[6])); - } - } - else - { - rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), - &ruby_error, 6, - rb_str_new2(argv[0]), - rb_str_new2(argv[1]), - rb_str_new2(argv[2]), - rb_str_new2(argv[3]), - rb_str_new2(argv[4]), - rb_str_new2(argv[5])); - } - } - else - { - rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), - &ruby_error, 5, - rb_str_new2(argv[0]), - rb_str_new2(argv[1]), - rb_str_new2(argv[2]), - rb_str_new2(argv[3]), - rb_str_new2(argv[4])); - } - } - else - { - rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), - &ruby_error, 4, - rb_str_new2(argv[0]), - rb_str_new2(argv[1]), - rb_str_new2(argv[2]), - rb_str_new2(argv[3])); - } - } - else - { - rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), - &ruby_error, 3, - rb_str_new2(argv[0]), - rb_str_new2(argv[1]), - rb_str_new2(argv[2])); - } - } - else + switch (format[i]) { - rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), - &ruby_error, 2, - rb_str_new2(argv[0]), - rb_str_new2(argv[1])); + case 's': /* string */ + argv2[i] = rb_str_new2 ((char *)argv[i]); + break; + case 'i': /* integer */ + argv2[i] = INT2FIX (*((int *)argv[i])); + break; + case 'h': /* hash */ + argv2[i] = (VALUE)argv[i]; + break; } } - else - { - rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), - &ruby_error, 1, - rb_str_new2(argv[0])); - } + } + + if (argc > 0) + { + rc = rb_protect_funcall ((VALUE) script->interpreter, + rb_intern(function), + &ruby_error, argc, argv2); } else { - rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), - &ruby_error, 0); + rc = rb_protect_funcall ((VALUE) script->interpreter, + rb_intern(function), + &ruby_error, 0, NULL); } if (ruby_error) @@ -366,6 +368,11 @@ weechat_ruby_exec (struct t_plugin_script *script, *ret_i = NUM2INT(rc); ret_value = ret_i; } + else if (ret_type == WEECHAT_SCRIPT_EXEC_HASHTABLE) + { + ret_value = weechat_ruby_hash_to_hashtable (rc, + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE); + } else { weechat_printf (NULL, @@ -451,7 +458,6 @@ weechat_ruby_output_flush (VALUE self) return Qnil; } - /* * weechat_ruby_load: load a Ruby script */ @@ -460,7 +466,7 @@ int weechat_ruby_load (const char *filename) { char modname[64]; - VALUE curModule, ruby_retcode, err; + VALUE curModule, ruby_retcode, err, argv[1]; int ruby_error; struct stat buf; @@ -488,9 +494,10 @@ weechat_ruby_load (const char *filename) curModule = rb_define_module(modname); ruby_current_script_filename = filename; - + + argv[0] = rb_str_new2 (filename); ruby_retcode = rb_protect_funcall (curModule, rb_intern("load_eval_file"), - &ruby_error, 1, rb_str_new2(filename)); + &ruby_error, 1, argv); if (ruby_retcode == Qnil) { @@ -536,7 +543,7 @@ weechat_ruby_load (const char *filename) } ruby_retcode = rb_protect_funcall (curModule, rb_intern("weechat_init"), - &ruby_error, 0); + &ruby_error, 0, NULL); if (ruby_error) { @@ -595,7 +602,6 @@ void weechat_ruby_unload (struct t_plugin_script *script) { int *r; - char *ruby_argv[1] = { NULL }; void *interpreter; if ((weechat_ruby_plugin->debug >= 1) || !ruby_quiet) @@ -610,7 +616,7 @@ weechat_ruby_unload (struct t_plugin_script *script) r = (int *) weechat_ruby_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, - ruby_argv); + 0, NULL); if (r) free (r); } diff --git a/src/plugins/scripts/ruby/weechat-ruby.h b/src/plugins/scripts/ruby/weechat-ruby.h index 2ef5cbbf4..49ab461be 100644 --- a/src/plugins/scripts/ruby/weechat-ruby.h +++ b/src/plugins/scripts/ruby/weechat-ruby.h @@ -35,8 +35,11 @@ extern struct t_plugin_script *ruby_current_script; extern struct t_plugin_script *ruby_registered_script; extern const char *ruby_current_script_filename; -extern void *weechat_ruby_exec (struct t_plugin_script *script, - int ret_type, const char *function, - char **argv); +extern VALUE weechat_ruby_hashtable_to_hash (struct t_hashtable *hashtable); +extern struct t_hashtable *weechat_ruby_hash_to_hashtable (VALUE dict, + int hashtable_size); +void *weechat_ruby_exec (struct t_plugin_script *script, + int ret_type, const char *function, + const char *format, void **argv); #endif /* __WEECHAT_RUBY_H */ diff --git a/src/plugins/scripts/script-api.c b/src/plugins/scripts/script-api.c index 04b8b5951..1a56807d7 100644 --- a/src/plugins/scripts/script-api.c +++ b/src/plugins/scripts/script-api.c @@ -1203,6 +1203,50 @@ script_api_hook_info (struct t_weechat_plugin *weechat_plugin, } /* + * script_api_hook_info_hashtable: hook an info_hashtable + * return new hook, NULL if error + */ + +struct t_hook * +script_api_hook_info_hashtable (struct t_weechat_plugin *weechat_plugin, + struct t_plugin_script *script, + const char *info_name, + const char *description, + const char *args_description, + const char *output_description, + struct t_hashtable *(*callback)(void *data, + const char *info_name, + struct t_hashtable *hashtable), + const char *function, + const char *data) +{ + struct t_script_callback *new_script_callback; + struct t_hook *new_hook; + + new_script_callback = script_callback_alloc (); + if (!new_script_callback) + return NULL; + + new_hook = weechat_hook_info_hashtable (info_name, description, + args_description, + output_description, + callback, new_script_callback); + if (!new_hook) + { + script_callback_free_data (new_script_callback); + free (new_script_callback); + return NULL; + } + + script_callback_init (new_script_callback, script, function, data); + new_script_callback->hook = new_hook; + + script_callback_add (script, new_script_callback); + + return new_hook; +} + +/* * script_api_hook_infolist: hook an infolist * return new hook, NULL if error */ diff --git a/src/plugins/scripts/script-api.h b/src/plugins/scripts/script-api.h index 94be78410..f7d8b312f 100644 --- a/src/plugins/scripts/script-api.h +++ b/src/plugins/scripts/script-api.h @@ -243,6 +243,17 @@ extern struct t_hook *script_api_hook_info (struct t_weechat_plugin *weechat_plu const char *arguments), const char *function, const char *data); +extern struct t_hook *script_api_hook_info_hashtable (struct t_weechat_plugin *weechat_plugin, + struct t_plugin_script *script, + const char *info_name, + const char *description, + const char *args_description, + const char *output_description, + struct t_hashtable *(*callback)(void *data, + const char *info_name, + struct t_hashtable *hashtable), + const char *function, + const char *data); extern struct t_hook *script_api_hook_infolist (struct t_weechat_plugin *weechat_plugin, struct t_plugin_script *script, const char *infolist_name, diff --git a/src/plugins/scripts/script.h b/src/plugins/scripts/script.h index 767259d9c..9b8bfb1ea 100644 --- a/src/plugins/scripts/script.h +++ b/src/plugins/scripts/script.h @@ -21,8 +21,15 @@ #define __WEECHAT_SCRIPT_H 1 /* constants which defines return types for weechat_<lang>_exec functions */ -#define WEECHAT_SCRIPT_EXEC_INT 1 -#define WEECHAT_SCRIPT_EXEC_STRING 2 + +enum t_weechat_script_exec_type +{ + WEECHAT_SCRIPT_EXEC_INT = 0, + WEECHAT_SCRIPT_EXEC_STRING, + WEECHAT_SCRIPT_EXEC_HASHTABLE, +}; + +#define WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE 16 #define WEECHAT_SCRIPT_MSG_NOT_INIT(__current_script, \ __function) \ diff --git a/src/plugins/scripts/tcl/weechat-tcl-api.c b/src/plugins/scripts/tcl/weechat-tcl-api.c index 0688652a9..538ce29ec 100644 --- a/src/plugins/scripts/tcl/weechat-tcl-api.c +++ b/src/plugins/scripts/tcl/weechat-tcl-api.c @@ -156,6 +156,11 @@ Tcl_SetIntObj (objp, __int); \ return TCL_OK; \ } +#define TCL_RETURN_OBJ(__obj) \ + { \ + Tcl_SetObjResult (interp, __obj); \ + return TCL_OK; \ + } /* @@ -1229,7 +1234,8 @@ weechat_tcl_api_config_reload_cb (void *data, struct t_config_file *config_file) { struct t_script_callback *script_callback; - char *tcl_argv[3], empty_arg[1] = { '\0' }; + void *tcl_argv[2]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1239,12 +1245,11 @@ weechat_tcl_api_config_reload_cb (void *data, { tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = script_ptr2str (config_file); - tcl_argv[2] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, - WEECHAT_SCRIPT_EXEC_INT, - script_callback->function, - tcl_argv); + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ss", tcl_argv); if (!rc) ret = WEECHAT_CONFIG_READ_FILE_NOT_FOUND; @@ -1315,7 +1320,8 @@ weechat_tcl_api_config_section_read_cb (void *data, const char *option_name, const char *value) { struct t_script_callback *script_callback; - char *tcl_argv[6], empty_arg[1] = { '\0' }; + void *tcl_argv[5]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1327,12 +1333,11 @@ weechat_tcl_api_config_section_read_cb (void *data, tcl_argv[2] = script_ptr2str (section); tcl_argv[3] = (option_name) ? (char *)option_name : empty_arg; tcl_argv[4] = (value) ? (char *)value : empty_arg; - tcl_argv[5] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, - WEECHAT_SCRIPT_EXEC_INT, - script_callback->function, - tcl_argv); + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "sssss", tcl_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_SET_ERROR; @@ -1362,7 +1367,8 @@ weechat_tcl_api_config_section_write_cb (void *data, const char *section_name) { struct t_script_callback *script_callback; - char *tcl_argv[4], empty_arg[1] = { '\0' }; + void *tcl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1372,12 +1378,11 @@ weechat_tcl_api_config_section_write_cb (void *data, tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = script_ptr2str (config_file); tcl_argv[2] = (section_name) ? (char *)section_name : empty_arg; - tcl_argv[3] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "sss", tcl_argv); if (!rc) ret = WEECHAT_CONFIG_WRITE_ERROR; @@ -1406,7 +1411,8 @@ weechat_tcl_api_config_section_write_default_cb (void *data, const char *section_name) { struct t_script_callback *script_callback; - char *tcl_argv[4], empty_arg[1] = { '\0' }; + void *tcl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1416,12 +1422,11 @@ weechat_tcl_api_config_section_write_default_cb (void *data, tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = script_ptr2str (config_file); tcl_argv[2] = (section_name) ? (char *)section_name : empty_arg; - tcl_argv[3] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "sss", tcl_argv); if (!rc) ret = WEECHAT_CONFIG_WRITE_ERROR; @@ -1452,7 +1457,8 @@ weechat_tcl_api_config_section_create_option_cb (void *data, const char *value) { struct t_script_callback *script_callback; - char *tcl_argv[6], empty_arg[1] = { '\0' }; + void *tcl_argv[5]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1464,12 +1470,11 @@ weechat_tcl_api_config_section_create_option_cb (void *data, tcl_argv[2] = script_ptr2str (section); tcl_argv[3] = (option_name) ? (char *)option_name : empty_arg; tcl_argv[4] = (value) ? (char *)value : empty_arg; - tcl_argv[5] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "sssss", tcl_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_SET_ERROR; @@ -1501,7 +1506,8 @@ weechat_tcl_api_config_section_delete_option_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *tcl_argv[5], empty_arg[1] = { '\0' }; + void *tcl_argv[4]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1512,12 +1518,11 @@ weechat_tcl_api_config_section_delete_option_cb (void *data, tcl_argv[1] = script_ptr2str (config_file); tcl_argv[2] = script_ptr2str (section); tcl_argv[3] = script_ptr2str (option); - tcl_argv[4] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "ssss", tcl_argv); if (!rc) ret = WEECHAT_CONFIG_OPTION_UNSET_ERROR; @@ -1663,7 +1668,8 @@ weechat_tcl_api_config_option_check_value_cb (void *data, const char *value) { struct t_script_callback *script_callback; - char *tcl_argv[4], empty_arg[1] = { '\0' }; + void *tcl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -1673,12 +1679,11 @@ weechat_tcl_api_config_option_check_value_cb (void *data, tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = script_ptr2str (option); tcl_argv[2] = (value) ? (char *)value : empty_arg; - tcl_argv[3] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "sss", tcl_argv); if (!rc) ret = 0; @@ -1705,7 +1710,8 @@ weechat_tcl_api_config_option_change_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *tcl_argv[3], empty_arg[1] = { '\0' }; + void *tcl_argv[2]; + char empty_arg[1] = { '\0' }; int *rc; script_callback = (struct t_script_callback *)data; @@ -1714,12 +1720,11 @@ weechat_tcl_api_config_option_change_cb (void *data, { tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = script_ptr2str (option); - tcl_argv[2] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "ss", tcl_argv); if (tcl_argv[1]) free (tcl_argv[1]); @@ -1738,7 +1743,8 @@ weechat_tcl_api_config_option_delete_cb (void *data, struct t_config_option *option) { struct t_script_callback *script_callback; - char *tcl_argv[3], empty_arg[1] = { '\0' }; + void *tcl_argv[2]; + char empty_arg[1] = { '\0' }; int *rc; script_callback = (struct t_script_callback *)data; @@ -1747,12 +1753,11 @@ weechat_tcl_api_config_option_delete_cb (void *data, { tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = script_ptr2str (option); - tcl_argv[2] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "ss", tcl_argv); if (tcl_argv[1]) free (tcl_argv[1]); @@ -3141,7 +3146,8 @@ weechat_tcl_api_hook_command_cb (void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { struct t_script_callback *script_callback; - char *tcl_argv[4], empty_arg[1] = { '\0' }; + void *tcl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; /* make C compiler happy */ @@ -3154,12 +3160,11 @@ weechat_tcl_api_hook_command_cb (void *data, struct t_gui_buffer *buffer, tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = script_ptr2str (buffer); tcl_argv[2] = (argc > 1) ? argv_eol[1] : empty_arg; - tcl_argv[3] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "sss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3236,7 +3241,8 @@ weechat_tcl_api_hook_command_run_cb (void *data, struct t_gui_buffer *buffer, const char *command) { struct t_script_callback *script_callback; - char *tcl_argv[4], empty_arg[1] = { '\0' }; + void *tcl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3246,12 +3252,11 @@ weechat_tcl_api_hook_command_run_cb (void *data, struct t_gui_buffer *buffer, tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = script_ptr2str (buffer); tcl_argv[2] = (command) ? (char *)command : empty_arg; - tcl_argv[3] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "sss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3318,7 +3323,8 @@ int weechat_tcl_api_hook_timer_cb (void *data, int remaining_calls) { struct t_script_callback *script_callback; - char *tcl_argv[3], str_remaining_calls[32], empty_arg[1] = { '\0' }; + void *tcl_argv[2]; + char str_remaining_calls[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3330,12 +3336,11 @@ weechat_tcl_api_hook_timer_cb (void *data, int remaining_calls) tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = str_remaining_calls; - tcl_argv[2] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "ss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3407,7 +3412,8 @@ int weechat_tcl_api_hook_fd_cb (void *data, int fd) { struct t_script_callback *script_callback; - char *tcl_argv[3], str_fd[32], empty_arg[1] = { '\0' }; + void *tcl_argv[2]; + char str_fd[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3418,12 +3424,11 @@ weechat_tcl_api_hook_fd_cb (void *data, int fd) tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = str_fd; - tcl_argv[2] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "ss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3498,7 +3503,8 @@ weechat_tcl_api_hook_process_cb (void *data, const char *out, const char *err) { struct t_script_callback *script_callback; - char *tcl_argv[6], str_rc[32], empty_arg[1] = { '\0' }; + void *tcl_argv[5]; + char str_rc[32], empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3512,12 +3518,11 @@ weechat_tcl_api_hook_process_cb (void *data, tcl_argv[2] = str_rc; tcl_argv[3] = (out) ? (char *)out : empty_arg; tcl_argv[4] = (err) ? (char *)err : empty_arg; - tcl_argv[5] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "sssss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3590,7 +3595,8 @@ weechat_tcl_api_hook_connect_cb (void *data, int status, int gnutls_rc, const char *error, const char *ip_address) { struct t_script_callback *script_callback; - char *tcl_argv[6], str_status[32], str_gnutls_rc[32]; + void *tcl_argv[5]; + char str_status[32], str_gnutls_rc[32]; char empty_arg[1] = { '\0' }; int *rc, ret; @@ -3606,12 +3612,11 @@ weechat_tcl_api_hook_connect_cb (void *data, int status, int gnutls_rc, tcl_argv[2] = str_gnutls_rc; tcl_argv[3] = (ip_address) ? (char *)ip_address : empty_arg; tcl_argv[4] = (error) ? (char *)error : empty_arg; - tcl_argv[5] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "sssss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3698,7 +3703,8 @@ weechat_tcl_api_hook_print_cb (void *data, struct t_gui_buffer *buffer, const char *prefix, const char *message) { struct t_script_callback *script_callback; - char *tcl_argv[9], empty_arg[1] = { '\0' }; + void *tcl_argv[8]; + char empty_arg[1] = { '\0' }; static char timebuffer[64]; int *rc, ret; @@ -3721,12 +3727,11 @@ weechat_tcl_api_hook_print_cb (void *data, struct t_gui_buffer *buffer, tcl_argv[5] = (highlight) ? strdup ("1") : strdup ("0"); tcl_argv[6] = (prefix) ? (char *)prefix : empty_arg; tcl_argv[7] = (message) ? (char *)message : empty_arg; - tcl_argv[8] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "ssssssss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3811,7 +3816,8 @@ weechat_tcl_api_hook_signal_cb (void *data, const char *signal, const char *type void *signal_data) { struct t_script_callback *script_callback; - char *tcl_argv[4], empty_arg[1] = { '\0' }; + void *tcl_argv[3]; + char empty_arg[1] = { '\0' }; static char value_str[64]; int *rc, ret, free_needed; @@ -3839,12 +3845,11 @@ weechat_tcl_api_hook_signal_cb (void *data, const char *signal, const char *type } else tcl_argv[2] = empty_arg; - tcl_argv[3] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "sss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -3970,7 +3975,8 @@ int weechat_tcl_api_hook_config_cb (void *data, const char *option, const char *value) { struct t_script_callback *script_callback; - char *tcl_argv[4], empty_arg[1] = { '\0' }; + void *tcl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -3980,12 +3986,11 @@ weechat_tcl_api_hook_config_cb (void *data, const char *option, const char *valu tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = (option) ? (char *)option : empty_arg; tcl_argv[2] = (value) ? (char *)value : empty_arg; - tcl_argv[3] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "sss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -4052,7 +4057,8 @@ weechat_tcl_api_hook_completion_cb (void *data, const char *completion_item, struct t_gui_completion *completion) { struct t_script_callback *script_callback; - char *tcl_argv[5], empty_arg[1] = { '\0' }; + void *tcl_argv[4]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4063,12 +4069,11 @@ weechat_tcl_api_hook_completion_cb (void *data, const char *completion_item, tcl_argv[1] = (completion_item) ? (char *)completion_item : empty_arg; tcl_argv[2] = script_ptr2str (buffer); tcl_argv[3] = script_ptr2str (completion); - tcl_argv[4] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "ssss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -4185,7 +4190,8 @@ weechat_tcl_api_hook_modifier_cb (void *data, const char *modifier, const char *modifier_data, const char *string) { struct t_script_callback *script_callback; - char *tcl_argv[5], empty_arg[1] = { '\0' }; + void *tcl_argv[4]; + char empty_arg[1] = { '\0' }; script_callback = (struct t_script_callback *)data; @@ -4195,12 +4201,11 @@ weechat_tcl_api_hook_modifier_cb (void *data, const char *modifier, tcl_argv[1] = (modifier) ? (char *)modifier : empty_arg; tcl_argv[2] = (modifier_data) ? (char *)modifier_data : empty_arg; tcl_argv[3] = (string) ? (char *)string : empty_arg; - tcl_argv[4] = NULL; return (char *)weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - tcl_argv); + "ssss", tcl_argv); } return NULL; @@ -4292,7 +4297,8 @@ weechat_tcl_api_hook_info_cb (void *data, const char *info_name, const char *arguments) { struct t_script_callback *script_callback; - char *tcl_argv[4], empty_arg[1] = { '\0' }; + void *tcl_argv[3]; + char empty_arg[1] = { '\0' }; script_callback = (struct t_script_callback *)data; @@ -4301,12 +4307,11 @@ weechat_tcl_api_hook_info_cb (void *data, const char *info_name, tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = (info_name) ? (char *)info_name : empty_arg; tcl_argv[2] = (arguments) ? (char *)arguments : empty_arg; - tcl_argv[3] = NULL; return (const char *)weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - tcl_argv); + "sss", tcl_argv); } return NULL; @@ -4358,6 +4363,83 @@ weechat_tcl_api_hook_info (ClientData clientData, Tcl_Interp *interp, } /* + * weechat_tcl_api_hook_info_hashtable_cb: callback for info_hashtable hooked + */ + +struct t_hashtable * +weechat_tcl_api_hook_info_hashtable_cb (void *data, const char *info_name, + struct t_hashtable *hashtable) +{ + struct t_script_callback *script_callback; + void *tcl_argv[3]; + char empty_arg[1] = { '\0' }; + + script_callback = (struct t_script_callback *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + tcl_argv[1] = (info_name) ? (char *)info_name : empty_arg; + tcl_argv[2] = hashtable; + + return (struct t_hashtable *)weechat_tcl_exec (script_callback->script, + WEECHAT_SCRIPT_EXEC_HASHTABLE, + script_callback->function, + "ssh", tcl_argv); + } + + return NULL; +} + +/* + * weechat_tcl_api_hook_info_hashtable: hook an info_hashtable + */ + +static int +weechat_tcl_api_hook_info_hashtable (ClientData clientData, Tcl_Interp *interp, + int objc, Tcl_Obj *CONST objv[]) +{ + Tcl_Obj *objp; + char *result, *info_name, *description, *args_description; + char *output_description, *function, *data; + int i; + + /* make C compiler happy */ + (void) clientData; + + if (!tcl_current_script) + { + WEECHAT_SCRIPT_MSG_NOT_INIT(TCL_CURRENT_SCRIPT_NAME, "hook_info_hashtable"); + TCL_RETURN_EMPTY; + } + + if (objc < 7) + { + WEECHAT_SCRIPT_MSG_WRONG_ARGS(TCL_CURRENT_SCRIPT_NAME, "hook_info_hashtable"); + TCL_RETURN_EMPTY; + } + + info_name = Tcl_GetStringFromObj (objv[1], &i); + description = Tcl_GetStringFromObj (objv[2], &i); + args_description = Tcl_GetStringFromObj (objv[3], &i); + output_description = Tcl_GetStringFromObj (objv[4], &i); + function = Tcl_GetStringFromObj (objv[5], &i); + data = Tcl_GetStringFromObj (objv[6], &i); + + result = script_ptr2str (script_api_hook_info_hashtable (weechat_tcl_plugin, + tcl_current_script, + info_name, + description, + args_description, + output_description, + &weechat_tcl_api_hook_info_hashtable_cb, + function, + data)); + + TCL_RETURN_STRING_FREE(result); +} + +/* * weechat_tcl_api_hook_infolist_cb: callback for infolist hooked */ @@ -4366,7 +4448,8 @@ weechat_tcl_api_hook_infolist_cb (void *data, const char *infolist_name, void *pointer, const char *arguments) { struct t_script_callback *script_callback; - char *tcl_argv[5], empty_arg[1] = { '\0' }; + void *tcl_argv[4]; + char empty_arg[1] = { '\0' }; struct t_infolist *result; script_callback = (struct t_script_callback *)data; @@ -4377,12 +4460,11 @@ weechat_tcl_api_hook_infolist_cb (void *data, const char *infolist_name, tcl_argv[1] = (infolist_name) ? (char *)infolist_name : empty_arg; tcl_argv[2] = script_ptr2str (pointer); tcl_argv[3] = (arguments) ? (char *)arguments : empty_arg; - tcl_argv[4] = NULL; result = (struct t_infolist *)weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - tcl_argv); + "ssss", tcl_argv); if (tcl_argv[2]) free (tcl_argv[2]); @@ -4509,7 +4591,8 @@ weechat_tcl_api_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer, const char *input_data) { struct t_script_callback *script_callback; - char *tcl_argv[4], empty_arg[1] = { '\0' }; + void *tcl_argv[3]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4519,12 +4602,11 @@ weechat_tcl_api_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer, tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = script_ptr2str (buffer); tcl_argv[2] = (input_data) ? (char *)input_data : empty_arg; - tcl_argv[3] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "sss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; else @@ -4549,7 +4631,8 @@ int weechat_tcl_api_buffer_close_cb (void *data, struct t_gui_buffer *buffer) { struct t_script_callback *script_callback; - char *tcl_argv[3], empty_arg[1] = { '\0' }; + void *tcl_argv[2]; + char empty_arg[1] = { '\0' }; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -4558,12 +4641,11 @@ weechat_tcl_api_buffer_close_cb (void *data, struct t_gui_buffer *buffer) { tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = script_ptr2str (buffer); - tcl_argv[2] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_INT, script_callback->function, - tcl_argv); + "ss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; else @@ -5518,7 +5600,8 @@ weechat_tcl_api_bar_item_build_cb (void *data, struct t_gui_bar_item *item, struct t_gui_window *window) { struct t_script_callback *script_callback; - char *tcl_argv[4], empty_arg[1] = { '\0' }, *ret; + void *tcl_argv[3]; + char empty_arg[1] = { '\0' }, *ret; script_callback = (struct t_script_callback *)data; @@ -5527,12 +5610,11 @@ weechat_tcl_api_bar_item_build_cb (void *data, struct t_gui_bar_item *item, tcl_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; tcl_argv[1] = script_ptr2str (item); tcl_argv[2] = script_ptr2str (window); - tcl_argv[3] = NULL; ret = (char *)weechat_tcl_exec (script_callback->script, WEECHAT_SCRIPT_EXEC_STRING, script_callback->function, - tcl_argv); + "sss", tcl_argv); if (tcl_argv[1]) free (tcl_argv[1]); @@ -5883,7 +5965,7 @@ weechat_tcl_api_command (ClientData clientData, Tcl_Interp *interp, } /* - * weechat_tcl_api_info_get: get info about WeeChat + * weechat_tcl_api_info_get: get info (as string) */ static int @@ -5916,6 +5998,48 @@ weechat_tcl_api_info_get (ClientData clientData, Tcl_Interp *interp, } /* + * weechat_tcl_api_info_get_hashtable: get info (as hashtable) + */ + +static int +weechat_tcl_api_info_get_hashtable (ClientData clientData, Tcl_Interp *interp, + int objc, Tcl_Obj *CONST objv[]) +{ + Tcl_Obj *objp, *result_dict; + struct t_hashtable *hashtable, *result_hashtable; + int i; + + /* make C compiler happy */ + (void) clientData; + + if (!tcl_current_script) + { + WEECHAT_SCRIPT_MSG_NOT_INIT(TCL_CURRENT_SCRIPT_NAME, "info_get_hashtable"); + TCL_RETURN_EMPTY; + } + + if (objc < 3) + { + WEECHAT_SCRIPT_MSG_WRONG_ARGS(TCL_CURRENT_SCRIPT_NAME, "info_get_hashtable"); + TCL_RETURN_EMPTY; + } + + hashtable = weechat_tcl_dict_to_hashtable (interp, objv[2], + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE); + + result_hashtable = weechat_info_get_hashtable (Tcl_GetStringFromObj (objv[1], &i), + hashtable); + result_dict = weechat_tcl_hashtable_to_dict (interp, result_hashtable); + + if (hashtable) + weechat_hashtable_free (hashtable); + if (result_hashtable) + weechat_hashtable_free (result_hashtable); + + TCL_RETURN_OBJ(result_dict); +} + +/* * weechat_tcl_api_infolist_new: create a new infolist */ @@ -6529,7 +6653,8 @@ weechat_tcl_api_upgrade_read_cb (void *data, struct t_infolist *infolist) { struct t_script_callback *script_callback; - char *tcl_argv[5], empty_arg[1] = { '\0' }, str_object_id[32]; + void *tcl_argv[4]; + char empty_arg[1] = { '\0' }, str_object_id[32]; int *rc, ret; script_callback = (struct t_script_callback *)data; @@ -6542,12 +6667,11 @@ weechat_tcl_api_upgrade_read_cb (void *data, tcl_argv[1] = script_ptr2str (upgrade_file); tcl_argv[2] = str_object_id; tcl_argv[3] = script_ptr2str (infolist); - tcl_argv[4] = NULL; rc = (int *) weechat_tcl_exec (script_callback->script, - WEECHAT_SCRIPT_EXEC_INT, - script_callback->function, - tcl_argv); + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ssss", tcl_argv); if (!rc) ret = WEECHAT_RC_ERROR; @@ -6917,6 +7041,8 @@ void weechat_tcl_api_init (Tcl_Interp *interp) weechat_tcl_api_hook_modifier_exec, (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); Tcl_CreateObjCommand (interp, "weechat::hook_info", weechat_tcl_api_hook_info, (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); + Tcl_CreateObjCommand (interp, "weechat::hook_info_hashtable", + weechat_tcl_api_hook_info_hashtable, (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); Tcl_CreateObjCommand (interp, "weechat::hook_infolist", weechat_tcl_api_hook_infolist, (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); Tcl_CreateObjCommand (interp, "weechat::unhook", @@ -6995,6 +7121,8 @@ void weechat_tcl_api_init (Tcl_Interp *interp) weechat_tcl_api_command, (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); Tcl_CreateObjCommand (interp, "weechat::info_get", weechat_tcl_api_info_get, (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); + Tcl_CreateObjCommand (interp, "weechat::info_get_hashtable", + weechat_tcl_api_info_get_hashtable, (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); Tcl_CreateObjCommand (interp, "weechat::infolist_new", weechat_tcl_api_infolist_new, (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); Tcl_CreateObjCommand (interp, "weechat::infolist_new_item", diff --git a/src/plugins/scripts/tcl/weechat-tcl.c b/src/plugins/scripts/tcl/weechat-tcl.c index f874c83b5..540e6391b 100644 --- a/src/plugins/scripts/tcl/weechat-tcl.c +++ b/src/plugins/scripts/tcl/weechat-tcl.c @@ -72,14 +72,106 @@ Tcl_Interp* cinterp; /* - * weechat_tcl_exec: execute a Tcl script + * weechat_tcl_hashtable_map_cb: callback called for each key/value in a + * hashtable + */ + +void +weechat_tcl_hashtable_map_cb (void *data, + struct t_hashtable *hashtable, + const void *key, + const void *value) +{ + void **data_array; + Tcl_Interp *interp; + Tcl_Obj *dict; + + /* make C compiler happy */ + (void) hashtable; + + data_array = (void **)data; + interp = data_array[0]; + dict = data_array[1]; + + Tcl_DictObjPut (interp, dict, + Tcl_NewStringObj ((char *)key, -1), + Tcl_NewStringObj ((char *)value, -1)); +} + +/* + * weechat_tcl_hashtable_to_dict: get tcl dict with a WeeChat hashtable + */ + +Tcl_Obj * +weechat_tcl_hashtable_to_dict (Tcl_Interp *interp, + struct t_hashtable *hashtable) +{ + Tcl_Obj *dict; + void *data[2]; + + dict = Tcl_NewDictObj (); + if (!dict) + return NULL; + + data[0] = interp; + data[1] = dict; + + weechat_hashtable_map (hashtable, + &weechat_tcl_hashtable_map_cb, + data); + + return dict; +} + +/* + * weechat_tcl_dict_to_hashtable: get WeeChat hashtable with tcl dict + * 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_tcl_dict_to_hashtable (Tcl_Interp *interp, Tcl_Obj *dict, + int hashtable_size) +{ + struct t_hashtable *hashtable; + Tcl_DictSearch search; + Tcl_Obj *key, *value; + int done; + + hashtable = weechat_hashtable_new (hashtable_size, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + if (!hashtable) + return NULL; + + if (Tcl_DictObjFirst (interp, dict, &search, &key, &value, &done) == TCL_OK) + { + for (; !done ; Tcl_DictObjNext(&search, &key, &value, &done)) + { + weechat_hashtable_set (hashtable, + (void *)Tcl_GetString (key), + (void *)Tcl_GetString (value)); + } + } + Tcl_DictObjDone(&search); + + return hashtable; +} + +/* + * weechat_tcl_exec: execute a tcl function */ void * weechat_tcl_exec (struct t_plugin_script *script, - int ret_type, const char *function, char **argv) + int ret_type, const char *function, + const char *format, void **argv) { - int i, llength; + int argc, i, llength; int *ret_i; char *ret_cv; void *ret_val; @@ -90,12 +182,12 @@ weechat_tcl_exec (struct t_plugin_script *script, old_tcl_script = tcl_current_script; tcl_current_script = script; interp = (Tcl_Interp*)script->interpreter; - + if (function && function[0]) { - cmdlist = Tcl_NewListObj(0,NULL); - Tcl_IncrRefCount(cmdlist); /* +1 */ - Tcl_ListObjAppendElement(interp,cmdlist,Tcl_NewStringObj(function,-1)); + cmdlist = Tcl_NewListObj (0, NULL); + Tcl_IncrRefCount (cmdlist); /* +1 */ + Tcl_ListObjAppendElement (interp, cmdlist, Tcl_NewStringObj (function,-1)); } else { @@ -103,20 +195,35 @@ weechat_tcl_exec (struct t_plugin_script *script, return NULL; } - if (argv) + if (format && format[0]) { - for (i = 0; argv[i]; i++) + argc = strlen (format); + for (i = 0; i < argc; i++) { - Tcl_ListObjAppendElement(interp,cmdlist,Tcl_NewStringObj(argv[i],-1)); + switch (format[i]) + { + case 's': /* string */ + Tcl_ListObjAppendElement (interp, cmdlist, + Tcl_NewStringObj (argv[i], -1)); + break; + case 'i': /* integer */ + Tcl_ListObjAppendElement (interp, cmdlist, + Tcl_NewStringObj (argv[i], -1)); + break; + case 'h': /* hash */ + Tcl_ListObjAppendElement (interp, cmdlist, + weechat_tcl_hashtable_to_dict (interp, argv[i])); + break; + } } } - - if (Tcl_ListObjLength(interp,cmdlist,&llength) != TCL_OK) + + if (Tcl_ListObjLength (interp, cmdlist, &llength) != TCL_OK) llength = 0; - + if (Tcl_EvalObjEx (interp, cmdlist, TCL_EVAL_DIRECT) == TCL_OK) { - Tcl_ListObjReplace(interp,cmdlist,0,llength,0,NULL); /* remove elements, decrement their ref count */ + Tcl_ListObjReplace (interp, cmdlist, 0, llength, 0, NULL); /* remove elements, decrement their ref count */ Tcl_DecrRefCount (cmdlist); /* -1 */ ret_val = NULL; if (ret_type == WEECHAT_SCRIPT_EXEC_STRING) @@ -135,6 +242,12 @@ weechat_tcl_exec (struct t_plugin_script *script, *ret_i = i; ret_val = (void *)ret_i; } + else if (ret_type == WEECHAT_SCRIPT_EXEC_HASHTABLE) + { + ret_val = weechat_tcl_dict_to_hashtable (interp, + Tcl_GetObjResult (interp), + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE); + } tcl_current_script = old_tcl_script; if (ret_val) @@ -147,8 +260,8 @@ weechat_tcl_exec (struct t_plugin_script *script, return NULL; } - Tcl_ListObjReplace(interp,cmdlist,0,llength,0,NULL); /* remove elements, decrement their ref count */ - Tcl_DecrRefCount(cmdlist); /* -1 */ + Tcl_ListObjReplace (interp, cmdlist, 0, llength, 0, NULL); /* remove elements, decrement their ref count */ + Tcl_DecrRefCount (cmdlist); /* -1 */ weechat_printf (NULL, weechat_gettext ("%s%s: unable to run function \"%s\": %s"), weechat_prefix ("error"), TCL_PLUGIN_NAME, function, @@ -258,7 +371,7 @@ weechat_tcl_unload (struct t_plugin_script *script) pointer = weechat_tcl_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, - NULL); + NULL, NULL); if (pointer) free (pointer); } diff --git a/src/plugins/scripts/tcl/weechat-tcl.h b/src/plugins/scripts/tcl/weechat-tcl.h index 78972233e..d3a7fd312 100644 --- a/src/plugins/scripts/tcl/weechat-tcl.h +++ b/src/plugins/scripts/tcl/weechat-tcl.h @@ -35,8 +35,13 @@ extern struct t_plugin_script *tcl_current_script; extern struct t_plugin_script *tcl_registered_script; extern const char *tcl_current_script_filename; +extern Tcl_Obj *weechat_tcl_hashtable_to_dict (Tcl_Interp *interp, + struct t_hashtable *hashtable); +extern struct t_hashtable *weechat_tcl_dict_to_hashtable (Tcl_Interp *interp, + Tcl_Obj *dict, + int hashtable_size); extern void *weechat_tcl_exec (struct t_plugin_script *script, - int ret_type, const char *function, - char **argv); + int ret_type, const char *function, + const char *format, void **argv); #endif /* __WEECHAT_TCL_H */ diff --git a/src/plugins/weechat-plugin.h b/src/plugins/weechat-plugin.h index 9765c31e4..abdea3f52 100644 --- a/src/plugins/weechat-plugin.h +++ b/src/plugins/weechat-plugin.h @@ -45,7 +45,7 @@ struct timeval; */ /* API version (used to check that plugin has same API and can be loaded) */ -#define WEECHAT_PLUGIN_API_VERSION "20100717-01" +#define WEECHAT_PLUGIN_API_VERSION "20100827-01" /* macros for defining plugin infos */ #define WEECHAT_PLUGIN_NAME(__name) \ @@ -273,6 +273,8 @@ struct t_weechat_plugin void *callback_map_data); int (*hashtable_get_integer) (struct t_hashtable *hashtable, const char *property); + const char *(*hashtable_get_string) (struct t_hashtable *hashtable, + const char *property); int (*hashtable_add_to_infolist) (struct t_hashtable *hashtable, struct t_infolist_item *infolist_item, const char *prefix); @@ -521,6 +523,15 @@ struct t_weechat_plugin const char *info_name, const char *arguments), void *callback_data); + struct t_hook *(*hook_info_hashtable) (struct t_weechat_plugin *plugin, + const char *info_name, + const char *description, + const char *args_description, + const char *output_description, + struct t_hashtable *(*callback)(void *data, + const char *info_name, + struct t_hashtable *hashtable), + void *callback_data); struct t_hook *(*hook_infolist) (struct t_weechat_plugin *plugin, const char *infolist_name, const char *description, @@ -643,6 +654,9 @@ struct t_weechat_plugin const char *(*info_get) (struct t_weechat_plugin *plugin, const char *info_name, const char *arguments); + struct t_hashtable *(*info_get_hashtable) (struct t_weechat_plugin *plugin, + const char *info_name, + struct t_hashtable *hashtable); /* infolists */ struct t_infolist *(*infolist_new) (); @@ -886,6 +900,8 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin); weechat_plugin->hashtable_map(__hashtable, __cb_map, __cb_map_data) #define weechat_hashtable_get_integer(__hashtable, __property) \ weechat_plugin->hashtable_get_integer(__hashtable, __property) +#define weechat_hashtable_get_string(__hashtable, __property) \ + weechat_plugin->hashtable_get_string(__hashtable, __property) #define weechat_hashtable_add_to_infolist(__hashtable, __infolist_item, \ __prefix) \ weechat_plugin->hashtable_add_to_infolist(__hashtable, \ @@ -1117,6 +1133,16 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin); weechat_plugin->hook_info(weechat_plugin, __info_name, \ __description, __args_description, \ __callback, __data) +#define weechat_hook_info_hashtable(__info_name, __description, \ + __args_description, \ + __output_description, \ + __callback, \ + __data) \ + weechat_plugin->hook_info_hashtable(weechat_plugin, __info_name, \ + __description, \ + __args_description, \ + __output_description, \ + __callback, __data) #define weechat_hook_infolist(__infolist_name, __description, \ __pointer_description, \ __args_description, __callback, __data) \ @@ -1243,6 +1269,9 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin); /* infos */ #define weechat_info_get(__info_name, __arguments) \ weechat_plugin->info_get(weechat_plugin, __info_name, __arguments) +#define weechat_info_get_hashtable(__info_name, __hashtable) \ + weechat_plugin->info_get_hashtable(weechat_plugin, __info_name, \ + __hashtable) /* infolists */ #define weechat_infolist_new() \ |