summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--debian/control2
-rw-r--r--doc/de/autogen/plugin_api/infos_hashtable.txt7
-rw-r--r--doc/de/weechat_scripting.de.txt4
-rw-r--r--doc/de/weechat_user.de.txt4
-rw-r--r--doc/docgen.pl97
-rw-r--r--doc/en/autogen/plugin_api/infos_hashtable.txt7
-rw-r--r--doc/en/weechat_plugin_api.en.txt383
-rw-r--r--doc/en/weechat_scripting.en.txt4
-rw-r--r--doc/en/weechat_user.en.txt4
-rw-r--r--doc/fr/autogen/plugin_api/infos_hashtable.txt7
-rw-r--r--doc/fr/weechat_plugin_api.fr.txt389
-rw-r--r--doc/fr/weechat_scripting.fr.txt4
-rw-r--r--doc/fr/weechat_user.fr.txt4
-rw-r--r--doc/it/autogen/plugin_api/infos_hashtable.txt7
-rw-r--r--doc/it/weechat_plugin_api.it.txt447
-rw-r--r--doc/it/weechat_scripting.it.txt4
-rw-r--r--doc/it/weechat_user.it.txt4
-rw-r--r--po/cs.po48
-rw-r--r--po/de.po40
-rw-r--r--po/es.po36
-rw-r--r--po/fr.po46
-rw-r--r--po/hu.po56
-rw-r--r--po/it.po44
-rw-r--r--po/pl.po48
-rw-r--r--po/ru.po40
-rw-r--r--po/weechat.pot29
-rw-r--r--src/core/wee-hashtable.c22
-rw-r--r--src/core/wee-hashtable.h2
-rw-r--r--src/core/wee-hook.c152
-rw-r--r--src/core/wee-hook.h28
-rw-r--r--src/core/wee-string.c2
-rw-r--r--src/plugins/irc/irc-info.c81
-rw-r--r--src/plugins/irc/irc-server.c43
-rw-r--r--src/plugins/irc/irc-server.h1
-rw-r--r--src/plugins/plugin.c3
-rw-r--r--src/plugins/scripts/lua/weechat-lua-api.c291
-rw-r--r--src/plugins/scripts/lua/weechat-lua.c143
-rw-r--r--src/plugins/scripts/lua/weechat-lua.h11
-rw-r--r--src/plugins/scripts/perl/weechat-perl-api.c285
-rw-r--r--src/plugins/scripts/perl/weechat-perl.c160
-rw-r--r--src/plugins/scripts/perl/weechat-perl.h5
-rw-r--r--src/plugins/scripts/python/weechat-python-api.c289
-rw-r--r--src/plugins/scripts/python/weechat-python.c200
-rw-r--r--src/plugins/scripts/python/weechat-python.h5
-rw-r--r--src/plugins/scripts/ruby/weechat-ruby-api.c300
-rw-r--r--src/plugins/scripts/ruby/weechat-ruby.c256
-rw-r--r--src/plugins/scripts/ruby/weechat-ruby.h9
-rw-r--r--src/plugins/scripts/script-api.c44
-rw-r--r--src/plugins/scripts/script-api.h11
-rw-r--r--src/plugins/scripts/script.h11
-rw-r--r--src/plugins/scripts/tcl/weechat-tcl-api.c298
-rw-r--r--src/plugins/scripts/tcl/weechat-tcl.c147
-rw-r--r--src/plugins/scripts/tcl/weechat-tcl.h9
-rw-r--r--src/plugins/weechat-plugin.h31
55 files changed, 3753 insertions, 856 deletions
diff --git a/ChangeLog b/ChangeLog
index 6f5f80dab..7eece243a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 |
diff --git a/po/cs.po b/po/cs.po
index d5e1512cb..a2e4ece3f 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -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"
diff --git a/po/de.po b/po/de.po
index eb894433c..c794fd276 100644
--- a/po/de.po
+++ b/po/de.po
@@ -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"
diff --git a/po/es.po b/po/es.po
index e876946ed..2d08116ab 100644
--- a/po/es.po
+++ b/po/es.po
@@ -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"
diff --git a/po/fr.po b/po/fr.po
index ff5088920..f3b41f7e5 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -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"
diff --git a/po/hu.po b/po/hu.po
index e25c405e7..e05f7dbf4 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -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"
diff --git a/po/it.po b/po/it.po
index 1f010a279..d1df6d4aa 100644
--- a/po/it.po
+++ b/po/it.po
@@ -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"
diff --git a/po/pl.po b/po/pl.po
index bf0fe9554..2b6b08ee6 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -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"
diff --git a/po/ru.po b/po/ru.po
index 98dbc8737..0f0aa7b17 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -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() \