1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-30 14:56:39 +02:00

Added tags for lines and custom filtering by tags or regex (task #7674), fixed many memory leaks

This commit is contained in:
Sebastien Helleu
2008-03-22 23:36:12 +01:00
parent 8c4dc57d8e
commit 61ca929728
73 changed files with 4824 additions and 2603 deletions
+4 -4
View File
@@ -147,8 +147,8 @@ demo_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer,
"buffer_input_data_cb: buffer = %x (%s / %s), "
"input_data = '%s'",
buffer,
weechat_buffer_get (buffer, "category"),
weechat_buffer_get (buffer, "name"),
weechat_buffer_get_string (buffer, "category"),
weechat_buffer_get_string (buffer, "name"),
input_data);
return WEECHAT_RC_OK;
@@ -169,8 +169,8 @@ demo_buffer_close_cb (void *data, struct t_gui_buffer *buffer)
weechat_printf (NULL,
"buffer_close_cb: buffer = %x (%s / %s)",
buffer,
weechat_buffer_get (buffer, "category"),
weechat_buffer_get (buffer, "name"));
weechat_buffer_get_string (buffer, "category"),
weechat_buffer_get_string (buffer, "name"));
}
return WEECHAT_RC_OK;
+3 -1
View File
@@ -169,12 +169,14 @@ irc_channel_free (struct t_irc_server *server, struct t_irc_channel *channel)
free (channel->modes);
if (channel->key)
free (channel->key);
//irc_nick_free_all (channel);
irc_nick_free_all (channel);
if (channel->away_message)
free (channel->away_message);
if (channel->nicks_speaking)
weechat_list_free (channel->nicks_speaking);
free (channel);
server->channels = new_channels;
}
+1 -1
View File
@@ -568,7 +568,7 @@ irc_command_connect (void *data, struct t_gui_buffer *buffer, int argc,
}
error = NULL;
number = strtol (argv[++i], &error, 10);
if (error && (error[0] == '\0'))
if (error && !error[0])
port = number;
}
}
+3 -2
View File
@@ -352,9 +352,10 @@ irc_nick_free (struct t_irc_channel *channel, struct t_irc_nick *nick)
free (nick->name);
if (nick->host)
free (nick->host);
free (nick);
channel->nicks = new_nicks;
free (nick);
channel->nicks = new_nicks;
channel->nick_completion_reset = 1;
}
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -46,7 +46,7 @@ struct t_irc_server;
typedef int (t_irc_recv_func)(struct t_irc_server *server, char *comand,
int argc, char **argv, char **argv_eol,
int ignore, int highlight);
int highlight);
struct t_irc_protocol_msg
{
+209 -132
View File
@@ -315,7 +315,7 @@ irc_server_set_addresses (struct t_irc_server *server, char *addresses)
pos++;
error = NULL;
number = strtol (pos, &error, 10);
server->ports_array[i] = (error && (error[0] == '\0')) ?
server->ports_array[i] = (error && !error[0]) ?
number : IRC_SERVER_DEFAULT_PORT;
}
else
@@ -990,6 +990,124 @@ irc_server_outqueue_send (struct t_irc_server *server)
}
}
/*
* irc_server_parse_message: parse IRC message and return pointer to
* host, command, channel, target nick and arguments
* (if any)
*/
void
irc_server_parse_message (char *message, char **nick, char **host,
char **command, char **channel, char **arguments)
{
char *pos, *pos2, *pos3, *pos4;
if (nick)
*nick = NULL;
if (host)
*host = NULL;
if (command)
*command = NULL;
if (channel)
*channel = NULL;
if (arguments)
*arguments = NULL;
if (message[0] == ':')
{
pos2 = strchr (message, '!');
pos = strchr (message, ' ');
if (pos2)
{
if (nick)
*nick = weechat_strndup (message + 1, pos2 - (message + 1));
}
else if (pos)
{
if (nick)
*nick = weechat_strndup (message + 1, pos - (message + 1));
}
if (pos)
{
if (host)
*host = weechat_strndup (message + 1, pos - (message + 1));
pos++;
}
else
pos = message;
}
else
pos = message;
if (pos && pos[0])
{
while (pos[0] == ' ')
{
pos++;
}
pos2 = strchr (pos, ' ');
if (pos2)
{
if (command)
*command = weechat_strndup (pos, pos2 - pos);
pos2++;
while (pos2[0] == ' ')
{
pos2++;
}
if (arguments)
*arguments = strdup (pos2);
if (pos2[0] != ':')
{
if (irc_channel_is_channel (pos2))
{
pos3 = strchr (pos2, ' ');
if (channel)
{
if (pos3)
*channel = weechat_strndup (pos2, pos3 - pos2);
else
*channel = strdup (pos2);
}
}
else
{
pos3 = strchr (pos2, ' ');
if (nick && !*nick)
{
if (nick)
{
if (pos3)
*nick = weechat_strndup (pos2, pos3 - pos2);
else
*nick = strdup (pos2);
}
}
if (pos3)
{
pos3++;
while (pos3[0] == ' ')
{
pos3++;
}
if (irc_channel_is_channel (pos3))
{
pos4 = strchr (pos3, ' ');
if (channel)
{
if (pos4)
*channel = weechat_strndup (pos3, pos4 - pos3);
else
*channel = strdup (pos3);
}
}
}
}
}
}
}
}
/*
* irc_server_send_one_msg: send one message to IRC server
*/
@@ -998,20 +1116,24 @@ int
irc_server_send_one_msg (struct t_irc_server *server, char *message)
{
static char buffer[4096];
char *new_msg, *ptr_msg, *pos;
char *new_msg, *ptr_msg, *pos, *nick, *command, *channel;
char *ptr_chan_nick, *msg_encoded;
char str_modifier[64], modifier_data[256];
int rc, queue, first_message;
time_t time_now;
rc = 1;
/*new_msg = plugin_modifier_exec (PLUGIN_MODIFIER_IRC_OUT,
server->name,
message)
*/
new_msg = NULL;
irc_server_parse_message (message, &nick, NULL, &command, &channel, NULL);
snprintf (str_modifier, sizeof (str_modifier),
"irc_out_%s",
(command) ? command : "unknown");
new_msg = weechat_hook_modifier_exec (str_modifier,
server->name,
message);
/* no changes in new message */
if (new_msg && (strcmp (buffer, new_msg) == 0))
if (new_msg && (strcmp (message, new_msg) == 0))
{
free (new_msg);
new_msg = NULL;
@@ -1022,6 +1144,31 @@ irc_server_send_one_msg (struct t_irc_server *server, char *message)
{
first_message = 1;
ptr_msg = (new_msg) ? new_msg : message;
msg_encoded = NULL;
ptr_chan_nick = (channel) ? channel : nick;
if (ptr_chan_nick)
{
snprintf (modifier_data, sizeof (modifier_data),
"%s.%s.%s",
weechat_plugin->name,
server->name,
ptr_chan_nick);
}
else
{
snprintf (modifier_data, sizeof (modifier_data),
"%s.%s.%s",
weechat_plugin->name,
server->name,
ptr_chan_nick);
}
msg_encoded = weechat_hook_modifier_exec ("charset_decode",
modifier_data,
ptr_msg);
if (msg_encoded)
ptr_msg = msg_encoded;
while (rc && ptr_msg && ptr_msg[0])
{
@@ -1073,9 +1220,18 @@ irc_server_send_one_msg (struct t_irc_server *server, char *message)
first_message = 0;
}
if (msg_encoded)
free (msg_encoded);
}
else
irc_debug_printf (server, 1, 1, _("(message dropped)"));
if (nick)
free (nick);
if (command)
free (command);
if (channel)
free (channel);
if (new_msg)
free (new_msg);
@@ -1124,95 +1280,6 @@ irc_server_sendf (struct t_irc_server *server, char *format, ...)
}
}
/*
* irc_server_parse_message: parse IRC message and return pointer to
* host, command, channel, target nick and arguments
* (if any)
*/
void
irc_server_parse_message (char *message, char **nick, char **host,
char **command, char **channel, char **arguments)
{
char *pos, *pos2, *pos3, *pos4;
*nick = NULL;
*host = NULL;
*command = NULL;
*channel = NULL;
*arguments = NULL;
if (message[0] == ':')
{
pos2 = strchr (message, '!');
pos = strchr (message, ' ');
if (pos2)
*nick = weechat_strndup (message + 1, pos2 - (message + 1));
else if (pos)
*nick = weechat_strndup (message + 1, pos - (message + 1));
if (pos)
{
*host = weechat_strndup (message + 1, pos - (message + 1));
pos++;
}
else
pos = message;
}
else
pos = message;
if (pos && pos[0])
{
while (pos[0] == ' ')
pos++;
pos2 = strchr (pos, ' ');
if (pos2)
{
*command = weechat_strndup (pos, pos2 - pos);
pos2++;
while (pos2[0] == ' ')
pos2++;
*arguments = strdup (pos2);
if (pos2[0] != ':')
{
if (irc_channel_is_channel (pos2))
{
pos3 = strchr (pos2, ' ');
if (pos3)
*channel = weechat_strndup (pos2, pos3 - pos2);
else
*channel = strdup (pos2);
}
else
{
pos3 = strchr (pos2, ' ');
if (!*nick)
{
if (pos3)
*nick = weechat_strndup (pos2, pos3 - pos2);
else
*nick = strdup (pos2);
}
if (pos3)
{
pos3++;
while (pos3[0] == ' ')
pos3++;
if (irc_channel_is_channel (pos3))
{
pos4 = strchr (pos3, ' ');
if (pos4)
*channel = weechat_strndup (pos3, pos4 - pos3);
else
*channel = strdup (pos3);
}
}
}
}
}
}
}
/*
* irc_server_msgq_add_msg: add a message to received messages queue (at the end)
*/
@@ -1257,7 +1324,7 @@ irc_server_msgq_add_msg (struct t_irc_server *server, char *msg)
else
message->data = strdup (msg);
message->next_message = NULL;
if (irc_msgq_last_msg)
{
irc_msgq_last_msg->next_message = message;
@@ -1357,8 +1424,7 @@ irc_server_msgq_flush ()
struct t_irc_message *next;
char *ptr_data, *new_msg, *ptr_msg, *pos;
char *nick, *host, *command, *channel, *arguments, *msg_decoded;
char *modifier_data, *ptr_chan_nick;
int length;
char str_modifier[64], modifier_data[256], *ptr_chan_nick;
while (irc_recv_msgq)
{
@@ -1366,15 +1432,24 @@ irc_server_msgq_flush ()
{
ptr_data = irc_recv_msgq->data;
while (ptr_data[0] == ' ')
{
ptr_data++;
}
if (ptr_data[0])
{
irc_debug_printf (irc_recv_msgq->server, 0, 0, ptr_data);
/*new_msg = plugin_modifier_exec (PLUGIN_MODIFIER_IRC_IN,
irc_recv_msgq->server->name,
ptr_data);*/
new_msg = NULL;
irc_server_parse_message (ptr_data, NULL, NULL, &command,
NULL, NULL);
snprintf (str_modifier, sizeof (str_modifier),
"irc_in_%s",
(command) ? command : "unknown");
new_msg = weechat_hook_modifier_exec (str_modifier,
irc_recv_msgq->server->name,
ptr_data);
if (command)
free (command);
/* no changes in new message */
if (new_msg && (strcmp (ptr_data, new_msg) == 0))
@@ -1404,33 +1479,26 @@ irc_server_msgq_flush ()
&arguments);
/* convert charset for message */
msg_decoded = NULL;
ptr_chan_nick = (channel) ? channel : nick;
length = strlen (weechat_plugin->name) + 1 +
strlen (irc_recv_msgq->server->name) + 1 +
((ptr_chan_nick) ? strlen (ptr_chan_nick) : 0) + 1;
modifier_data = (char *)malloc (length * sizeof (char));
if (modifier_data)
if (ptr_chan_nick)
{
if (ptr_chan_nick)
{
snprintf (modifier_data, length, "%s.%s.%s",
weechat_plugin->name,
irc_recv_msgq->server->name,
ptr_chan_nick);
}
else
{
snprintf (modifier_data, length, "%s.%s.%s",
weechat_plugin->name,
irc_recv_msgq->server->name,
ptr_chan_nick);
}
msg_decoded = weechat_hook_modifier_exec ("charset_decode",
modifier_data,
ptr_msg);
free (modifier_data);
snprintf (modifier_data, sizeof (modifier_data),
"%s.%s.%s",
weechat_plugin->name,
irc_recv_msgq->server->name,
ptr_chan_nick);
}
else
{
snprintf (modifier_data, sizeof (modifier_data),
"%s.%s.%s",
weechat_plugin->name,
irc_recv_msgq->server->name,
ptr_chan_nick);
}
msg_decoded = weechat_hook_modifier_exec ("charset_decode",
modifier_data,
ptr_msg);
/* parse and execute command */
irc_protocol_recv_command (irc_recv_msgq->server,
@@ -1440,12 +1508,18 @@ irc_server_msgq_flush ()
command,
arguments);
if (nick)
free (nick);
if (host)
free (host);
if (command)
free (command);
if (channel)
free (channel);
if (arguments)
free (arguments);
if (msg_decoded)
free (msg_decoded);
if (pos)
{
@@ -1457,8 +1531,10 @@ irc_server_msgq_flush ()
}
}
else
{
irc_debug_printf (irc_recv_msgq->server, 0, 1,
_("(message dropped)"));
}
if (new_msg)
free (new_msg);
}
@@ -1468,7 +1544,7 @@ irc_server_msgq_flush ()
next = irc_recv_msgq->next_message;
free (irc_recv_msgq);
irc_recv_msgq = next;
if (irc_recv_msgq == NULL)
if (!irc_recv_msgq)
irc_msgq_last_msg = NULL;
}
}
@@ -1744,11 +1820,11 @@ irc_server_switch_address (struct t_irc_server *server)
}
/*
* irc_server_child_read: read connection progress from child process
* irc_server_child_read_cb: read connection progress from child process
*/
int
irc_server_child_read (void *arg_server)
irc_server_child_read_cb (void *arg_server)
{
struct t_irc_server *server;
char buffer[1];
@@ -1843,6 +1919,7 @@ irc_server_child_read (void *arg_server)
break;
}
}
return WEECHAT_RC_OK;
}
@@ -2560,7 +2637,7 @@ irc_server_connect (struct t_irc_server *server, int disable_autojoin)
server->child_pid = pid;
server->hook_fd = weechat_hook_fd (server->child_read,
1, 0, 0,
irc_server_child_read,
irc_server_child_read_cb,
server);
#endif
+15 -39
View File
@@ -137,17 +137,12 @@ extern const int gnutls_prot_prio[];
#endif
extern struct t_irc_message *irc_recv_msgq, *irc_msgq_last_msg;
extern void irc_server_init (struct t_irc_server *server);
extern int irc_server_init_with_url (struct t_irc_server *server, char *irc_url);
extern void irc_server_set_nick (struct t_irc_server *server, char *nick);
extern struct t_irc_server *irc_server_alloc ();
extern void irc_server_init_with_config_options (struct t_irc_server *server,
struct t_config_section *section,
int config_reload);
extern struct t_irc_server *irc_server_alloc ();
extern void irc_server_outqueue_free_all (struct t_irc_server *server);
extern void irc_server_free_data (struct t_irc_server *server);
extern void irc_server_free (struct t_irc_server *server);
extern void irc_server_free_all ();
extern struct t_irc_server *irc_server_new (char *name, int autoconnect,
int autoreconnect,
int autoreconnect_delay,
@@ -162,46 +157,27 @@ extern struct t_irc_server *irc_server_new (char *name, int autoconnect,
extern struct t_irc_server *irc_server_duplicate (struct t_irc_server *server,
char *new_name);
extern int irc_server_rename (struct t_irc_server *server, char *new_name);
extern int irc_server_send (struct t_irc_server *server, char *buffer,
int size_buf);
extern void irc_server_outqueue_send (struct t_irc_server *server);
extern void irc_server_sendf (struct t_irc_server *server, char *format, ...);
extern void irc_server_parse_message (char *message, char **nick,
char **host, char **command,
char **channel, char **arguments);
extern int irc_server_recv_cb (void *arg_server);
extern int irc_server_timer_cb (void *data);
extern void irc_server_timer_check_away (void *empty);
extern int irc_server_child_read (void *arg_server);
extern void irc_server_convbase64_8x3_to_6x4 (char *from, char *to);
extern void irc_server_base64encode (char *from, char *to);
extern int irc_server_pass_httpproxy (int sock, char *address, int port);
extern int irc_server_resolve (char *hostname, char *ip, int *version);
extern int irc_server_pass_socks4proxy (int sock, char *address, int port,
char *username);
extern int irc_server_pass_socks5proxy (int sock, char *address, int port);
extern int irc_server_pass_proxy (int sock, char *address, int port,
char *username);
extern void irc_server_set_nick (struct t_irc_server *server, char *nick);
extern struct t_irc_server *irc_server_search (char *server_name);
extern void irc_server_free_all ();
extern int irc_server_connect (struct t_irc_server *server,
int disable_autojoin);
extern void irc_server_reconnect (struct t_irc_server *server);
extern void irc_server_auto_connect (int auto_connect, int temp_server);
extern void irc_server_disconnect (struct t_irc_server *server, int reconnect);
extern void irc_server_disconnect_all ();
extern void irc_server_autojoin_channels ();
extern struct t_irc_server *irc_server_search (char *server_name);
extern int irc_server_get_number_connected ();
extern void irc_server_get_number_buffer (struct t_irc_server *server,
int *server_pos, int *server_total);
extern int irc_server_timer_cb (void *data);
extern void irc_server_sendf (struct t_irc_server *server, char *format, ...);
extern void irc_server_outqueue_free_all (struct t_irc_server *server);
extern int irc_server_get_channel_count (struct t_irc_server *server);
extern int irc_server_get_pv_count (struct t_irc_server *server);
extern void irc_server_remove_away ();
extern void irc_server_check_away ();
extern void irc_server_set_away (struct t_irc_server *server, char *nick,
int is_away);
extern int irc_server_get_default_notify_level (struct t_irc_server *server);
extern void irc_server_set_default_notify_level (struct t_irc_server *server,
int notify);
extern void irc_server_remove_away ();
extern void irc_server_check_away ();
extern void irc_server_reconnect (struct t_irc_server *server);
extern void irc_server_disconnect (struct t_irc_server *server, int reconnect);
extern void irc_server_disconnect_all ();
extern void irc_server_free (struct t_irc_server *server);
extern void irc_server_free_data (struct t_irc_server *server);
extern void irc_server_print_log ();
#endif /* irc-server.h */
+5 -5
View File
@@ -29,22 +29,22 @@
#define IRC_GET_SERVER(__buffer) \
struct t_weechat_plugin *buffer_plugin = NULL; \
struct t_irc_server *ptr_server = NULL; \
buffer_plugin = weechat_buffer_get (__buffer, "plugin"); \
buffer_plugin = weechat_buffer_get_pointer (__buffer, "plugin"); \
if (buffer_plugin == weechat_irc_plugin) \
ptr_server = irc_server_search ( \
weechat_buffer_get (__buffer, "category"));
weechat_buffer_get_string (__buffer, "category"));
#define IRC_GET_SERVER_CHANNEL(__buffer) \
struct t_weechat_plugin *buffer_plugin = NULL; \
struct t_irc_server *ptr_server = NULL; \
struct t_irc_channel *ptr_channel = NULL; \
buffer_plugin = weechat_buffer_get (__buffer, "plugin"); \
buffer_plugin = weechat_buffer_get_pointer (__buffer, "plugin"); \
if (buffer_plugin == weechat_irc_plugin) \
{ \
ptr_server = irc_server_search ( \
weechat_buffer_get (__buffer, "category")); \
weechat_buffer_get_string (__buffer, "category")); \
ptr_channel = irc_channel_search ( \
ptr_server, weechat_buffer_get (__buffer, "name")); \
ptr_server, weechat_buffer_get_string (__buffer, "name")); \
}
#define IRC_COLOR_CHAT weechat_color("color_chat")
+16 -7
View File
@@ -130,10 +130,10 @@ logger_config_read ()
{
error = NULL;
number = strtol (string, &error, 10);
if (error && (error[0] == '\0'))
if (error && !error[0])
logger_option_backlog = number;
}
if (logger_option_path && logger_option_time_format && logger_option_backlog)
if (logger_option_path && logger_option_time_format)
return 1;
else
return 0;
@@ -374,10 +374,14 @@ logger_start_buffer_all ()
struct t_plugin_infolist *ptr_infolist;
ptr_infolist = weechat_infolist_get ("buffer", NULL);
while (weechat_infolist_next (ptr_infolist))
if (ptr_infolist)
{
logger_start_buffer (weechat_infolist_pointer (ptr_infolist,
"pointer"));
while (weechat_infolist_next (ptr_infolist))
{
logger_start_buffer (weechat_infolist_pointer (ptr_infolist,
"pointer"));
}
weechat_infolist_free (ptr_infolist);
}
}
@@ -598,6 +602,7 @@ logger_stop_signal_cb (void *data, char *signal, char *type_data,
int
logger_print_cb (void *data, struct t_gui_buffer *buffer, time_t date,
int tags_count, char **tags,
char *prefix, char *message)
{
struct t_logger_buffer *ptr_logger_buffer;
@@ -606,7 +611,9 @@ logger_print_cb (void *data, struct t_gui_buffer *buffer, time_t date,
/* make C compiler happy */
(void) data;
(void) tags_count;
(void) tags;
ptr_logger_buffer = logger_buffer_search (buffer);
if (ptr_logger_buffer && ptr_logger_buffer->log_filename
&& ptr_logger_buffer->log_enabled)
@@ -614,8 +621,10 @@ logger_print_cb (void *data, struct t_gui_buffer *buffer, time_t date,
date_tmp = localtime (&date);
buf_time[0] = '\0';
if (date_tmp)
{
strftime (buf_time, sizeof (buf_time) - 1,
logger_option_time_format, date_tmp);
}
logger_write_line (ptr_logger_buffer,
"%s\t%s\t%s",
@@ -667,7 +676,7 @@ weechat_plugin_init (struct t_weechat_plugin *plugin)
weechat_hook_signal ("logger_start", &logger_start_signal_cb, NULL);
weechat_hook_signal ("logger_stop", &logger_stop_signal_cb, NULL);
weechat_hook_print (NULL, NULL, 1, &logger_print_cb, NULL);
weechat_hook_print (NULL, NULL, NULL, 1, &logger_print_cb, NULL);
weechat_hook_config ("plugin", "logger." LOGGER_OPTION_PATH,
&logger_config_cb, NULL);
+11 -4
View File
@@ -38,6 +38,7 @@
#include "../gui/gui-buffer.h"
#include "../gui/gui-chat.h"
#include "../gui/gui-color.h"
#include "../gui/gui-filter.h"
#include "../gui/gui-infobar.h"
#include "../gui/gui-keyboard.h"
#include "../gui/gui-window.h"
@@ -318,7 +319,7 @@ char *
plugin_api_info_get (struct t_weechat_plugin *plugin, char *info)
{
time_t inactivity;
static char keyboard_inactivity[32];
static char value[32];
if (!plugin || !info)
return NULL;
@@ -361,9 +362,13 @@ plugin_api_info_get (struct t_weechat_plugin *plugin, char *info)
inactivity = 0;
else
inactivity = time (NULL) - gui_keyboard_last_activity_time;
snprintf (keyboard_inactivity, sizeof (keyboard_inactivity),
"%ld", (long int)inactivity);
return keyboard_inactivity;
snprintf (value, sizeof (value), "%ld", (long int)inactivity);
return value;
}
else if (string_strcasecmp (info, "filters_enabled") == 0)
{
snprintf (value, sizeof (value), "%d", gui_filters_enabled);
return value;
}
/* info not found */
@@ -402,6 +407,8 @@ plugin_api_infolist_get_add_buffer (struct t_plugin_infolist *infolist,
return 0;
if (!plugin_infolist_new_var_integer (ptr_item, "num_displayed", buffer->num_displayed))
return 0;
if (!plugin_infolist_new_var_integer (ptr_item, "lines_hidden", buffer->lines_hidden))
return 0;
if (!plugin_infolist_new_var_string (ptr_item, "title", buffer->title))
return 0;
if (!plugin_infolist_new_var_integer (ptr_item, "input", buffer->input))
+16 -5
View File
@@ -261,12 +261,10 @@ plugin_config_free (struct t_config_option *option)
if (option->next_option)
(option->next_option)->prev_option = option->prev_option;
/* free data */
if (option->name)
free (option->name);
if (option->value)
free (option->value);
/* free option */
config_file_option_free_data (option);
free (option);
plugin_options = new_plugin_options;
}
@@ -278,7 +276,9 @@ void
plugin_config_free_all ()
{
while (plugin_options)
{
plugin_config_free (plugin_options);
}
}
/*
@@ -396,3 +396,14 @@ plugin_config_write ()
log_printf (_("Saving plugins configuration to disk"));
return config_file_write (plugin_config);
}
/*
* plugin_config_end: end plugin config
*/
void
plugin_config_end ()
{
/* free all plugin config options */
plugin_config_free_all ();
}
+1
View File
@@ -35,5 +35,6 @@ extern void plugin_config_init ();
extern int plugin_config_read ();
extern int plugin_config_reload ();
extern int plugin_config_write ();
extern void plugin_config_end ();
#endif /* plugin-config.h */
+6
View File
@@ -476,6 +476,8 @@ plugin_infolist_var_free (struct t_plugin_infolist_item *item,
free (var->value);
}
free (var);
item->vars = new_vars;
}
@@ -511,6 +513,8 @@ plugin_infolist_item_free (struct t_plugin_infolist *list,
if (item->fields)
free (item->fields);
free (item);
list->items = new_items;
}
@@ -543,6 +547,8 @@ plugin_infolist_free (struct t_plugin_infolist *list)
plugin_infolist_item_free (list, list->items);
}
free (list);
plugin_infolists = new_plugin_infolists;
}
+22 -4
View File
@@ -88,6 +88,7 @@ plugin_load (char *filename)
void *handle;
char *name, *author, *description, *version, *license, *charset;
t_weechat_init_func *init_func;
int rc;
struct t_weechat_plugin *new_plugin;
if (!filename)
@@ -242,6 +243,7 @@ plugin_load (char *filename)
new_plugin->strncasecmp = &string_strncasecmp;
new_plugin->strcmp_ignore_chars = &string_strcmp_ignore_chars;
new_plugin->strcasestr = &string_strcasestr;
new_plugin->string_match = &string_match;
new_plugin->string_replace = &string_replace;
new_plugin->string_remove_quotes = &string_remove_quotes;
new_plugin->string_strip = &string_strip;
@@ -309,7 +311,7 @@ plugin_load (char *filename)
new_plugin->prefix = &plugin_api_prefix;
new_plugin->color = &plugin_api_color;
new_plugin->printf_date = &gui_chat_printf_date;
new_plugin->printf_date_tags = &gui_chat_printf_date_tags;
new_plugin->infobar_printf = &plugin_api_infobar_printf;
new_plugin->infobar_remove = &plugin_api_infobar_remove;
new_plugin->log_printf = &log_printf;
@@ -330,7 +332,8 @@ plugin_load (char *filename)
new_plugin->buffer_new = &gui_buffer_new;
new_plugin->buffer_search = &gui_buffer_search_by_category_name;
new_plugin->buffer_close = &gui_buffer_close;
new_plugin->buffer_get = &gui_buffer_get;
new_plugin->buffer_get_string = &gui_buffer_get_string;
new_plugin->buffer_get_pointer = &gui_buffer_get_pointer;
new_plugin->buffer_set = &gui_buffer_set;
new_plugin->nicklist_add_group = &gui_nicklist_add_group;
@@ -374,7 +377,8 @@ plugin_load (char *filename)
last_weechat_plugin = new_plugin;
/* init plugin */
if (((t_weechat_init_func *)init_func) (new_plugin) < 0)
rc = ((t_weechat_init_func *)init_func) (new_plugin);
if (rc != WEECHAT_RC_OK)
{
gui_chat_printf (NULL,
_("%sError: unable to initialize plugin "
@@ -428,11 +432,14 @@ plugin_auto_load_file (void *plugin, char *filename)
{
if (string_strcasecmp (pos,
CONFIG_STRING(config_plugins_extension)) == 0)
{
plugin_load (filename);
}
}
}
else
plugin_load (filename);
return 1;
}
@@ -559,10 +566,15 @@ plugin_remove (struct t_weechat_plugin *plugin)
free (plugin->name);
if (plugin->description)
free (plugin->description);
if (plugin->author)
free (plugin->author);
if (plugin->version)
free (plugin->version);
if (plugin->license)
free (plugin->license);
if (plugin->charset)
free (plugin->charset);
free (plugin);
weechat_plugins = new_weechat_plugins;
@@ -578,11 +590,12 @@ plugin_unload (struct t_weechat_plugin *plugin)
t_weechat_end_func *end_func;
char *name;
name = (plugin->name) ? strdup (plugin->name) : strdup ("???");
name = (plugin->name) ? strdup (plugin->name) : NULL;
end_func = dlsym (plugin->handle, "weechat_plugin_end");
if (end_func)
(void) (end_func) (plugin);
plugin_remove (plugin);
gui_chat_printf (NULL,
@@ -622,7 +635,9 @@ void
plugin_unload_all ()
{
while (weechat_plugins)
{
plugin_unload (last_weechat_plugin);
}
}
/*
@@ -687,6 +702,9 @@ plugin_end ()
/* unload all plugins */
plugin_unload_all ();
/* free all plugin options */
plugin_config_end ();
}
/*
+67 -58
View File
@@ -2208,22 +2208,27 @@ weechat_lua_api_hook_fd (lua_State *L)
int
weechat_lua_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
time_t date, char *prefix, char *message)
time_t date, int tags_count, char **tags,
char *prefix, char *message)
{
struct t_script_callback *script_callback;
char *lua_argv[5];
char *lua_argv[6];
static char timebuffer[64];
int *rc, ret;
/* make C compiler happy */
(void) tags_count;
script_callback = (struct t_script_callback *)data;
snprintf (timebuffer, sizeof (timebuffer) - 1, "%ld", date);
lua_argv[0] = script_ptr2str (buffer);
lua_argv[1] = timebuffer;
lua_argv[2] = prefix;
lua_argv[3] = message;
lua_argv[4] = NULL;
lua_argv[2] = weechat_string_build_with_exploded (tags, ",");
lua_argv[3] = prefix;
lua_argv[4] = message;
lua_argv[5] = NULL;
rc = (int *) weechat_lua_exec (script_callback->script,
WEECHAT_SCRIPT_EXEC_INT,
@@ -2237,6 +2242,10 @@ weechat_lua_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
ret = *rc;
free (rc);
}
if (lua_argv[0])
free (lua_argv[0]);
if (lua_argv[2])
free (lua_argv[2]);
return ret;
}
@@ -2248,7 +2257,7 @@ weechat_lua_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
static int
weechat_lua_api_hook_print (lua_State *L)
{
const char *buffer, *message, *function;
const char *buffer, *tags, *message, *function;
char *result;
int n, strip_colors;
@@ -2262,6 +2271,7 @@ weechat_lua_api_hook_print (lua_State *L)
}
buffer = NULL;
tags = NULL;
message = NULL;
strip_colors = 0;
function = NULL;
@@ -2274,7 +2284,8 @@ weechat_lua_api_hook_print (lua_State *L)
LUA_RETURN_EMPTY;
}
buffer = lua_tostring (lua_current_interpreter, -4);
buffer = lua_tostring (lua_current_interpreter, -5);
tags = lua_tostring (lua_current_interpreter, -4);
message = lua_tostring (lua_current_interpreter, -3);
strip_colors = lua_tonumber (lua_current_interpreter, -2);
function = lua_tostring (lua_current_interpreter, -1);
@@ -2282,6 +2293,7 @@ weechat_lua_api_hook_print (lua_State *L)
result = script_ptr2str (script_api_hook_print (weechat_lua_plugin,
lua_current_script,
script_str2ptr ((char *)buffer),
(char *)tags,
(char *)message,
strip_colors,
&weechat_lua_api_hook_print_cb,
@@ -2979,11 +2991,11 @@ weechat_lua_api_buffer_close (lua_State *L)
}
/*
* weechat_lua_api_buffer_get: get a buffer property
* weechat_lua_api_buffer_get_string: get a buffer property as string
*/
static int
weechat_lua_api_buffer_get (lua_State *L)
weechat_lua_api_buffer_get_string (lua_State *L)
{
const char *buffer, *property;
char *value;
@@ -2994,7 +3006,7 @@ weechat_lua_api_buffer_get (lua_State *L)
if (!lua_current_script)
{
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get");
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get_string");
LUA_RETURN_EMPTY;
}
@@ -3005,19 +3017,59 @@ weechat_lua_api_buffer_get (lua_State *L)
if (n < 2)
{
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get");
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get_string");
LUA_RETURN_EMPTY;
}
buffer = lua_tostring (lua_current_interpreter, -2);
property = lua_tostring (lua_current_interpreter, -1);
value = weechat_buffer_get (script_str2ptr ((char *)buffer),
(char *)property);
value = weechat_buffer_get_string (script_str2ptr ((char *)buffer),
(char *)property);
LUA_RETURN_STRING(value);
}
/*
* weechat_lua_api_buffer_get_pointer: get a buffer property as pointer
*/
static int
weechat_lua_api_buffer_get_pointer (lua_State *L)
{
const char *buffer, *property;
char *value;
int n;
/* make C compiler happy */
(void) L;
if (!lua_current_script)
{
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get_pointer");
LUA_RETURN_EMPTY;
}
buffer = NULL;
property = NULL;
n = lua_gettop (lua_current_interpreter);
if (n < 2)
{
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get_pointer");
LUA_RETURN_EMPTY;
}
buffer = lua_tostring (lua_current_interpreter, -2);
property = lua_tostring (lua_current_interpreter, -1);
value = script_ptr2str (weechat_buffer_get_string (script_str2ptr ((char *)buffer),
(char *)property));
LUA_RETURN_STRING_FREE(value);
}
/*
* weechat_lua_api_buffer_set: set a buffer property
*/
@@ -4169,46 +4221,6 @@ weechat_lua_api_constant_weechat_rc_error (lua_State *L)
return 1;
}
static int
weechat_lua_api_constant_weechat_rc_ok_ignore_weechat (lua_State *L)
{
/* make C compiler happy */
(void) L;
lua_pushnumber (lua_current_interpreter, WEECHAT_RC_OK_IGNORE_WEECHAT);
return 1;
}
static int
weechat_lua_api_constant_weechat_rc_ok_ignore_plugins (lua_State *L)
{
/* make C compiler happy */
(void) L;
lua_pushnumber (lua_current_interpreter, WEECHAT_RC_OK_IGNORE_PLUGINS);
return 1;
}
static int
weechat_lua_api_constant_weechat_rc_ok_ignore_all (lua_State *L)
{
/* make C compiler happy */
(void) L;
lua_pushnumber (lua_current_interpreter, WEECHAT_RC_OK_IGNORE_ALL);
return 1;
}
static int
weechat_lua_api_constant_weechat_rc_ok_with_highlight (lua_State *L)
{
/* make C compiler happy */
(void) L;
lua_pushnumber (lua_current_interpreter, WEECHAT_RC_OK_WITH_HIGHLIGHT);
return 1;
}
static int
weechat_lua_api_constant_weechat_list_pos_sort (lua_State *L)
{
@@ -4372,7 +4384,8 @@ const struct luaL_reg weechat_lua_api_funcs[] = {
{ "buffer_new", &weechat_lua_api_buffer_new },
{ "buffer_search", &weechat_lua_api_buffer_search },
{ "buffer_close", &weechat_lua_api_buffer_close },
{ "buffer_get", &weechat_lua_api_buffer_get },
{ "buffer_get_string", &weechat_lua_api_buffer_get_string },
{ "buffer_get_pointer", &weechat_lua_api_buffer_get_pointer },
{ "buffer_set", &weechat_lua_api_buffer_set },
{ "nicklist_add_group", &weechat_lua_api_nicklist_add_group },
{ "nicklist_search_group", &weechat_lua_api_nicklist_search_group },
@@ -4403,10 +4416,6 @@ const struct luaL_reg weechat_lua_api_funcs[] = {
/* define constants as function which returns values */
{ "WEECHAT_RC_OK", &weechat_lua_api_constant_weechat_rc_ok },
{ "WEECHAT_RC_ERROR", &weechat_lua_api_constant_weechat_rc_error },
{ "WEECHAT_RC_OK_IGNORE_WEECHAT", &weechat_lua_api_constant_weechat_rc_ok_ignore_weechat },
{ "WEECHAT_RC_OK_IGNORE_PLUGINS", &weechat_lua_api_constant_weechat_rc_ok_ignore_plugins },
{ "WEECHAT_RC_OK_IGNORE_ALL", &weechat_lua_api_constant_weechat_rc_ok_ignore_all },
{ "WEECHAT_RC_OK_WITH_HIGHLIGHT", &weechat_lua_api_constant_weechat_rc_ok_with_highlight },
{ "WEECHAT_LIST_POS_SORT", &weechat_lua_api_constant_weechat_list_pos_sort },
{ "WEECHAT_LIST_POS_BEGINNING", &weechat_lua_api_constant_weechat_list_pos_beginning },
{ "WEECHAT_LIST_POS_END", &weechat_lua_api_constant_weechat_list_pos_end },
+58 -20
View File
@@ -1815,22 +1815,27 @@ static XS (XS_weechat_hook_fd)
int
weechat_perl_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
time_t date, char *prefix, char *message)
time_t date, int tags_count, char **tags,
char *prefix, char *message)
{
struct t_script_callback *script_callback;
char *perl_argv[5];
char *perl_argv[6];
static char timebuffer[64];
int *rc, ret;
/* make C compiler happy */
(void) tags_count;
script_callback = (struct t_script_callback *)data;
snprintf (timebuffer, sizeof (timebuffer) - 1, "%ld", date);
perl_argv[0] = script_ptr2str (buffer);
perl_argv[1] = timebuffer;
perl_argv[2] = prefix;
perl_argv[3] = message;
perl_argv[4] = NULL;
perl_argv[2] = weechat_string_build_with_exploded (tags, ",");
perl_argv[3] = prefix;
perl_argv[4] = message;
perl_argv[5] = NULL;
rc = (int *) weechat_perl_exec (script_callback->script,
WEECHAT_SCRIPT_EXEC_INT,
@@ -1846,6 +1851,8 @@ weechat_perl_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
}
if (perl_argv[0])
free (perl_argv[0]);
if (perl_argv[2])
free (perl_argv[2]);
return ret;
}
@@ -1856,7 +1863,7 @@ weechat_perl_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
static XS (XS_weechat_hook_print)
{
char *result, *buffer, *message, *function;
char *result, *buffer, *tags, *message, *function;
dXSARGS;
/* make C compiler happy */
@@ -1868,20 +1875,22 @@ static XS (XS_weechat_hook_print)
PERL_RETURN_EMPTY;
}
if (items < 4)
if (items < 5)
{
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("hook_print");
PERL_RETURN_EMPTY;
}
buffer = SvPV (ST (0), PL_na);
message = SvPV (ST (1), PL_na);
function = SvPV (ST (3), PL_na);
tags = SvPV (ST (1), PL_na);
message = SvPV (ST (2), PL_na);
function = SvPV (ST (4), PL_na);
result = script_ptr2str (script_api_hook_print (weechat_perl_plugin,
perl_current_script,
script_str2ptr (buffer),
tags,
message,
SvIV (ST (2)), /* strip_colors */
SvIV (ST (3)), /* strip_colors */
&weechat_perl_api_hook_print_cb,
function));
@@ -2492,10 +2501,10 @@ static XS (XS_weechat_buffer_close)
}
/*
* weechat::buffer_get: get a buffer property
* weechat::buffer_get_string: get a buffer property as string
*/
static XS (XS_weechat_buffer_get)
static XS (XS_weechat_buffer_get_string)
{
char *value, *buffer, *property;
dXSARGS;
@@ -2505,23 +2514,55 @@ static XS (XS_weechat_buffer_get)
if (!perl_current_script)
{
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get");
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get_string");
PERL_RETURN_EMPTY;
}
if (items < 2)
{
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get");
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get_string");
PERL_RETURN_EMPTY;
}
buffer = SvPV (ST (0), PL_na);
property = SvPV (ST (1), PL_na);
value = weechat_buffer_get (script_str2ptr (buffer), property);
value = weechat_buffer_get_string (script_str2ptr (buffer), property);
PERL_RETURN_STRING(value);
}
/*
* weechat::buffer_get_pointer: get a buffer property as pointer
*/
static XS (XS_weechat_buffer_get_pointer)
{
char *value, *buffer, *property;
dXSARGS;
/* make C compiler happy */
(void) cv;
if (!perl_current_script)
{
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get_pointer");
PERL_RETURN_EMPTY;
}
if (items < 2)
{
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get_pointer");
PERL_RETURN_EMPTY;
}
buffer = SvPV (ST (0), PL_na);
property = SvPV (ST (1), PL_na);
value = script_ptr2str (weechat_buffer_get_pointer (script_str2ptr (buffer),
property));
PERL_RETURN_STRING_FREE(value);
}
/*
* weechat::buffer_set: set a buffer property
*/
@@ -3489,7 +3530,8 @@ weechat_perl_api_init (pTHX)
newXS ("weechat::buffer_new", XS_weechat_buffer_new, "weechat");
newXS ("weechat::buffer_search", XS_weechat_buffer_search, "weechat");
newXS ("weechat::buffer_close", XS_weechat_buffer_close, "weechat");
newXS ("weechat::buffer_get", XS_weechat_buffer_get, "weechat");
newXS ("weechat::buffer_get_string", XS_weechat_buffer_get_string, "weechat");
newXS ("weechat::buffer_get_pointer", XS_weechat_buffer_get_pointer, "weechat");
newXS ("weechat::buffer_set", XS_weechat_buffer_set, "weechat");
newXS ("weechat::nicklist_add_group", XS_weechat_nicklist_add_group, "weechat");
newXS ("weechat::nicklist_search_group", XS_weechat_nicklist_search_group, "weechat");
@@ -3522,10 +3564,6 @@ weechat_perl_api_init (pTHX)
stash = gv_stashpv ("weechat", TRUE);
newCONSTSUB (stash, "weechat::WEECHAT_RC_OK", newSViv (WEECHAT_RC_OK));
newCONSTSUB (stash, "weechat::WEECHAT_RC_ERROR", newSViv (WEECHAT_RC_ERROR));
newCONSTSUB (stash, "weechat::WEECHAT_RC_OK_IGNORE_WEECHAT", newSViv (WEECHAT_RC_OK_IGNORE_WEECHAT));
newCONSTSUB (stash, "weechat::WEECHAT_RC_OK_IGNORE_PLUGINS", newSViv (WEECHAT_RC_OK_IGNORE_PLUGINS));
newCONSTSUB (stash, "weechat::WEECHAT_RC_OK_IGNORE_ALL", newSViv (WEECHAT_RC_OK_IGNORE_ALL));
newCONSTSUB (stash, "weechat::WEECHAT_RC_OK_WITH_HIGHLIGHT", newSViv (WEECHAT_RC_OK_WITH_HIGHLIGHT));
newCONSTSUB (stash, "weechat::WEECHAT_LIST_POS_SORT", newSVpv (WEECHAT_LIST_POS_SORT, PL_na));
newCONSTSUB (stash, "weechat::WEECHAT_LIST_POS_BEGINNING", newSVpv (WEECHAT_LIST_POS_BEGINNING, PL_na));
newCONSTSUB (stash, "weechat::WEECHAT_LIST_POS_END", newSVpv (WEECHAT_LIST_POS_END, PL_na));
+59 -15
View File
@@ -1939,22 +1939,27 @@ weechat_python_api_hook_fd (PyObject *self, PyObject *args)
int
weechat_python_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
time_t date, char *prefix, char *message)
time_t date, int tags_count, char **tags,
char *prefix, char *message)
{
struct t_script_callback *script_callback;
char *python_argv[5];
char *python_argv[6];
static char timebuffer[64];
int *rc, ret;
/* make C compiler happy */
(void) tags_count;
script_callback = (struct t_script_callback *)data;
snprintf (timebuffer, sizeof (timebuffer) - 1, "%ld", date);
python_argv[0] = script_ptr2str (buffer);
python_argv[1] = timebuffer;
python_argv[2] = prefix;
python_argv[3] = message;
python_argv[4] = NULL;
python_argv[2] = weechat_string_build_with_exploded (tags, ",");
python_argv[3] = prefix;
python_argv[4] = message;
python_argv[5] = NULL;
rc = (int *) weechat_python_exec (script_callback->script,
WEECHAT_SCRIPT_EXEC_INT,
@@ -1970,6 +1975,8 @@ weechat_python_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
}
if (python_argv[0])
free (python_argv[0]);
if (python_argv[2])
free (python_argv[2]);
return ret;
}
@@ -1981,7 +1988,7 @@ weechat_python_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
static PyObject *
weechat_python_api_hook_print (PyObject *self, PyObject *args)
{
char *buffer, *message, *function, *result;
char *buffer, *tags, *message, *function, *result;
int strip_colors;
PyObject *object;
@@ -1995,12 +2002,13 @@ weechat_python_api_hook_print (PyObject *self, PyObject *args)
}
buffer = NULL;
tags = NULL;
message = NULL;
strip_colors = 0;
function = NULL;
if (!PyArg_ParseTuple (args, "ssis", &buffer, &message, &strip_colors,
&function))
if (!PyArg_ParseTuple (args, "sssis", &buffer, &tags, &message,
&strip_colors, &function))
{
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("hook_print");
PYTHON_RETURN_EMPTY;
@@ -2009,6 +2017,7 @@ weechat_python_api_hook_print (PyObject *self, PyObject *args)
result = script_ptr2str(script_api_hook_print (weechat_python_plugin,
python_current_script,
script_str2ptr (buffer),
tags,
message,
strip_colors,
&weechat_python_api_hook_print_cb,
@@ -2146,7 +2155,7 @@ weechat_python_api_hook_signal_send (PyObject *self, PyObject *args)
{
error = NULL;
number = (int)strtol (signal_data, &error, 10);
if (error && (error[0] == '\0'))
if (error && !error[0])
{
weechat_hook_signal_send (signal, type_data, &number);
}
@@ -2645,11 +2654,11 @@ weechat_python_api_buffer_close (PyObject *self, PyObject *args)
}
/*
* weechat_python_api_buffer_get: get a buffer property
* weechat_python_api_buffer_get_string: get a buffer property as string
*/
static PyObject *
weechat_python_api_buffer_get (PyObject *self, PyObject *args)
weechat_python_api_buffer_get_string (PyObject *self, PyObject *args)
{
char *buffer, *property, *value;
@@ -2658,7 +2667,7 @@ weechat_python_api_buffer_get (PyObject *self, PyObject *args)
if (!python_current_script)
{
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get");
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get_string");
PYTHON_RETURN_ERROR;
}
@@ -2667,15 +2676,49 @@ weechat_python_api_buffer_get (PyObject *self, PyObject *args)
if (!PyArg_ParseTuple (args, "ss", &buffer, &property))
{
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get");
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get_string");
PYTHON_RETURN_EMPTY;
}
value = weechat_buffer_get (script_str2ptr (buffer), property);
value = weechat_buffer_get_string (script_str2ptr (buffer), property);
PYTHON_RETURN_STRING(value);
}
/*
* weechat_python_api_buffer_get_pointer: get a buffer property as pointer
*/
static PyObject *
weechat_python_api_buffer_get_pointer (PyObject *self, PyObject *args)
{
char *buffer, *property, *value;
PyObject *object;
/* make C compiler happy */
(void) self;
if (!python_current_script)
{
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get_pointer");
PYTHON_RETURN_ERROR;
}
buffer = NULL;
property = NULL;
if (!PyArg_ParseTuple (args, "ss", &buffer, &property))
{
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get_pointer");
PYTHON_RETURN_EMPTY;
}
value = script_ptr2str (weechat_buffer_get_pointer (script_str2ptr (buffer),
property));
PYTHON_RETURN_STRING_FREE(value);
}
/*
* weechat_python_api_buffer_set: set a buffer property
*/
@@ -3710,7 +3753,8 @@ PyMethodDef weechat_python_funcs[] =
{ "buffer_new", &weechat_python_api_buffer_new, METH_VARARGS, "" },
{ "buffer_search", &weechat_python_api_buffer_search, METH_VARARGS, "" },
{ "buffer_close", &weechat_python_api_buffer_close, METH_VARARGS, "" },
{ "buffer_get", &weechat_python_api_buffer_get, METH_VARARGS, "" },
{ "buffer_get_string", &weechat_python_api_buffer_get_string, METH_VARARGS, "" },
{ "buffer_get_pointer", &weechat_python_api_buffer_get_pointer, METH_VARARGS, "" },
{ "buffer_set", &weechat_python_api_buffer_set, METH_VARARGS, "" },
{ "nicklist_add_group", &weechat_python_api_nicklist_add_group, METH_VARARGS, "" },
{ "nicklist_search_group", &weechat_python_api_nicklist_search_group, METH_VARARGS, "" },
+10 -7
View File
@@ -87,9 +87,16 @@ weechat_python_exec (struct t_plugin_script *script,
{
if (argv[4])
{
rc = PyObject_CallFunction (evFunc, "sssss", argv[0],
argv[1], argv[2], argv[3],
argv[4]);
if (argv[5])
{
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],
@@ -315,10 +322,6 @@ weechat_python_load (char *filename)
weechat_dict = PyModule_GetDict(weechat_module);
PyDict_SetItemString(weechat_dict, "WEECHAT_RC_OK", PyInt_FromLong((long) WEECHAT_RC_OK));
PyDict_SetItemString(weechat_dict, "WEECHAT_RC_ERROR", PyInt_FromLong((long) WEECHAT_RC_ERROR));
PyDict_SetItemString(weechat_dict, "WEECHAT_RC_OK_IGNORE_WEECHAT", PyInt_FromLong((long) WEECHAT_RC_OK_IGNORE_WEECHAT));
PyDict_SetItemString(weechat_dict, "WEECHAT_RC_OK_IGNORE_PLUGINS", PyInt_FromLong((long) WEECHAT_RC_OK_IGNORE_PLUGINS));
PyDict_SetItemString(weechat_dict, "WEECHAT_RC_OK_IGNORE_ALL", PyInt_FromLong((long) WEECHAT_RC_OK_IGNORE_ALL));
PyDict_SetItemString(weechat_dict, "WEECHAT_RC_OK_WITH_HIGHLIGHT", PyInt_FromLong((long) WEECHAT_RC_OK_WITH_HIGHLIGHT));
PyDict_SetItemString(weechat_dict, "WEECHAT_LIST_POS_SORT", PyString_FromString(WEECHAT_LIST_POS_SORT));
PyDict_SetItemString(weechat_dict, "WEECHAT_LIST_POS_BEGINNING", PyString_FromString(WEECHAT_LIST_POS_BEGINNING));
PyDict_SetItemString(weechat_dict, "WEECHAT_LIST_POS_END", PyString_FromString(WEECHAT_LIST_POS_END));
+68 -23
View File
@@ -2244,22 +2244,27 @@ weechat_ruby_api_hook_fd (VALUE class, VALUE fd, VALUE read, VALUE write,
int
weechat_ruby_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
time_t date, char *prefix, char *message)
time_t date, int tags_count, char **tags,
char *prefix, char *message)
{
struct t_script_callback *script_callback;
char *ruby_argv[5];
char *ruby_argv[6];
static char timebuffer[64];
int *rc, ret;
/* make C compiler happy */
(void) tags_count;
script_callback = (struct t_script_callback *)data;
snprintf (timebuffer, sizeof (timebuffer) - 1, "%ld", date);
ruby_argv[0] = script_ptr2str (buffer);
ruby_argv[1] = timebuffer;
ruby_argv[2] = prefix;
ruby_argv[3] = message;
ruby_argv[4] = NULL;
ruby_argv[2] = weechat_string_build_with_exploded (tags, ",");
ruby_argv[3] = prefix;
ruby_argv[4] = message;
ruby_argv[5] = NULL;
rc = (int *) weechat_ruby_exec (script_callback->script,
WEECHAT_SCRIPT_EXEC_INT,
@@ -2275,6 +2280,8 @@ weechat_ruby_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
}
if (ruby_argv[0])
free (ruby_argv[0]);
if (ruby_argv[2])
free (ruby_argv[2]);
return ret;
}
@@ -2284,10 +2291,10 @@ weechat_ruby_api_hook_print_cb (void *data, struct t_gui_buffer *buffer,
*/
static VALUE
weechat_ruby_api_hook_print (VALUE class, VALUE buffer, VALUE message,
VALUE strip_colors, VALUE function)
weechat_ruby_api_hook_print (VALUE class, VALUE buffer, VALUE tags,
VALUE message, VALUE strip_colors, VALUE function)
{
char *c_buffer, *c_message, *c_function, *result;
char *c_buffer, *c_tags, *c_message, *c_function, *result;
int c_strip_colors;
VALUE return_value;
@@ -2301,23 +2308,26 @@ weechat_ruby_api_hook_print (VALUE class, VALUE buffer, VALUE message,
}
c_buffer = NULL;
c_tags = NULL;
c_message = NULL;
c_strip_colors = 0;
c_function = NULL;
if (NIL_P (buffer) || NIL_P (message) || NIL_P (strip_colors)
|| NIL_P (function))
if (NIL_P (buffer) || NIL_P (tags) || NIL_P (message)
|| NIL_P (strip_colors) || NIL_P (function))
{
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("hook_print");
RUBY_RETURN_EMPTY;
}
Check_Type (buffer, T_STRING);
Check_Type (tags, T_STRING);
Check_Type (message, T_STRING);
Check_Type (strip_colors, T_FIXNUM);
Check_Type (function, T_STRING);
c_buffer = STR2CSTR (buffer);
c_tags = STR2CSTR (tags);
c_message = STR2CSTR (message);
c_strip_colors = FIX2INT (strip_colors);
c_function = STR2CSTR (function);
@@ -2325,6 +2335,7 @@ weechat_ruby_api_hook_print (VALUE class, VALUE buffer, VALUE message,
result = script_ptr2str (script_api_hook_print (weechat_ruby_plugin,
ruby_current_script,
script_str2ptr (c_buffer),
c_tags,
c_message,
c_strip_colors,
&weechat_ruby_api_hook_print_cb,
@@ -3034,11 +3045,11 @@ weechat_ruby_api_buffer_close (VALUE class, VALUE buffer,
}
/*
* weechat_ruby_api_buffer_get: get a buffer property
* weechat_ruby_api_buffer_get_string: get a buffer property as string
*/
static VALUE
weechat_ruby_api_buffer_get (VALUE class, VALUE buffer, VALUE property)
weechat_ruby_api_buffer_get_string (VALUE class, VALUE buffer, VALUE property)
{
char *c_buffer, *c_property, *value;
@@ -3047,13 +3058,13 @@ weechat_ruby_api_buffer_get (VALUE class, VALUE buffer, VALUE property)
if (!ruby_current_script)
{
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get");
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get_string");
RUBY_RETURN_EMPTY;
}
if (NIL_P (buffer) || NIL_P (property))
{
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get");
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get_string");
RUBY_RETURN_EMPTY;
}
@@ -3063,12 +3074,49 @@ weechat_ruby_api_buffer_get (VALUE class, VALUE buffer, VALUE property)
c_buffer = STR2CSTR (buffer);
c_property = STR2CSTR (property);
value = weechat_buffer_get (script_str2ptr (c_buffer),
c_property);
value = weechat_buffer_get_string (script_str2ptr (c_buffer),
c_property);
RUBY_RETURN_STRING(value);
}
/*
* weechat_ruby_api_buffer_get_pointer: get a buffer property as pointer
*/
static VALUE
weechat_ruby_api_buffer_get_pointer (VALUE class, VALUE buffer, VALUE property)
{
char *c_buffer, *c_property, *value;
VALUE return_value;
/* make C compiler happy */
(void) class;
if (!ruby_current_script)
{
WEECHAT_SCRIPT_MSG_NOT_INITIALIZED("buffer_get_pointer");
RUBY_RETURN_EMPTY;
}
if (NIL_P (buffer) || NIL_P (property))
{
WEECHAT_SCRIPT_MSG_WRONG_ARGUMENTS("buffer_get_pointer");
RUBY_RETURN_EMPTY;
}
Check_Type (buffer, T_STRING);
Check_Type (property, T_STRING);
c_buffer = STR2CSTR (buffer);
c_property = STR2CSTR (property);
value = script_ptr2str (weechat_buffer_get_string (script_str2ptr (c_buffer),
c_property));
RUBY_RETURN_STRING_FREE(value);
}
/*
* weechat_ruby_api_buffer_set: set a buffer property
*/
@@ -4171,10 +4219,6 @@ weechat_ruby_api_init (VALUE ruby_mWeechat)
{
rb_define_const(ruby_mWeechat, "WEECHAT_RC_OK", INT2NUM(WEECHAT_RC_OK));
rb_define_const(ruby_mWeechat, "WEECHAT_RC_ERROR", INT2NUM(WEECHAT_RC_ERROR));
rb_define_const(ruby_mWeechat, "WEECHAT_RC_OK_IGNORE_WEECHAT", INT2NUM(WEECHAT_RC_OK_IGNORE_WEECHAT));
rb_define_const(ruby_mWeechat, "WEECHAT_RC_OK_IGNORE_PLUGINS", INT2NUM(WEECHAT_RC_OK_IGNORE_PLUGINS));
rb_define_const(ruby_mWeechat, "WEECHAT_RC_OK_IGNORE_ALL", INT2NUM(WEECHAT_RC_OK_IGNORE_ALL));
rb_define_const(ruby_mWeechat, "WEECHAT_RC_OK_WITH_HIGHLIGHT", INT2NUM(WEECHAT_RC_OK_WITH_HIGHLIGHT));
rb_define_const(ruby_mWeechat, "WEECHAT_LIST_POS_SORT", rb_str_new2(WEECHAT_LIST_POS_SORT));
rb_define_const(ruby_mWeechat, "WEECHAT_LIST_POS_BEGINNING", rb_str_new2(WEECHAT_LIST_POS_BEGINNING));
rb_define_const(ruby_mWeechat, "WEECHAT_LIST_POS_END", rb_str_new2(WEECHAT_LIST_POS_END));
@@ -4231,7 +4275,7 @@ weechat_ruby_api_init (VALUE ruby_mWeechat)
rb_define_module_function (ruby_mWeechat, "hook_command", &weechat_ruby_api_hook_command, 6);
rb_define_module_function (ruby_mWeechat, "hook_timer", &weechat_ruby_api_hook_timer, 4);
rb_define_module_function (ruby_mWeechat, "hook_fd", &weechat_ruby_api_hook_fd, 5);
rb_define_module_function (ruby_mWeechat, "hook_print", &weechat_ruby_api_hook_print, 4);
rb_define_module_function (ruby_mWeechat, "hook_print", &weechat_ruby_api_hook_print, 5);
rb_define_module_function (ruby_mWeechat, "hook_signal", &weechat_ruby_api_hook_signal, 2);
rb_define_module_function (ruby_mWeechat, "hook_signal_send", &weechat_ruby_api_hook_signal_send, 3);
rb_define_module_function (ruby_mWeechat, "hook_config", &weechat_ruby_api_hook_config, 3);
@@ -4243,7 +4287,8 @@ weechat_ruby_api_init (VALUE ruby_mWeechat)
rb_define_module_function (ruby_mWeechat, "buffer_new", &weechat_ruby_api_buffer_new, 4);
rb_define_module_function (ruby_mWeechat, "buffer_search", &weechat_ruby_api_buffer_search, 2);
rb_define_module_function (ruby_mWeechat, "buffer_close", &weechat_ruby_api_buffer_close, 1);
rb_define_module_function (ruby_mWeechat, "buffer_get", &weechat_ruby_api_buffer_get, 2);
rb_define_module_function (ruby_mWeechat, "buffer_get_string", &weechat_ruby_api_buffer_get_string, 2);
rb_define_module_function (ruby_mWeechat, "buffer_get_pointer", &weechat_ruby_api_buffer_get_pointer, 2);
rb_define_module_function (ruby_mWeechat, "buffer_set", &weechat_ruby_api_buffer_set, 3);
rb_define_module_function (ruby_mWeechat, "nicklist_add_group", &weechat_ruby_api_nicklist_add_group, 5);
rb_define_module_function (ruby_mWeechat, "nicklist_search_group", &weechat_ruby_api_nicklist_search_group, 3);
+19 -7
View File
@@ -124,13 +124,25 @@ weechat_ruby_exec (struct t_plugin_script *script,
{
if (argv[4])
{
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]));
if (argv[5])
{
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),
+5 -4
View File
@@ -481,11 +481,12 @@ struct t_hook *
script_api_hook_print (struct t_weechat_plugin *weechat_plugin,
struct t_plugin_script *script,
struct t_gui_buffer *buffer,
char *message, int strip_colors,
char *tags, char *message, int strip_colors,
int (*callback)(void *data,
struct t_gui_buffer *buffer,
time_t date, char *prefix,
char *message),
time_t date,
int tags_count, char **tags,
char *prefix, char *message),
char *function)
{
struct t_script_callback *new_script_callback;
@@ -495,7 +496,7 @@ script_api_hook_print (struct t_weechat_plugin *weechat_plugin,
if (!new_script_callback)
return NULL;
new_hook = weechat_hook_print (buffer, message, strip_colors,
new_hook = weechat_hook_print (buffer, tags, message, strip_colors,
callback, new_script_callback);
if (!new_hook)
{
+5 -1
View File
@@ -95,10 +95,14 @@ extern struct t_hook *script_api_hook_fd (struct t_weechat_plugin *weechat_plugi
extern struct t_hook *script_api_hook_print (struct t_weechat_plugin *weechat_plugin,
struct t_plugin_script *script,
struct t_gui_buffer *buffer,
char *message, int strip_colors,
char *tags,
char *message,
int strip_colors,
int (*callback)(void *data,
struct t_gui_buffer *buffer,
time_t date,
int tags_count,
char **tags,
char *prefix,
char *message),
char *function);
+1 -1
View File
@@ -98,7 +98,7 @@ weechat_trigger_list_del (char *pattern, char *commands,
number = strtol (pattern, &error, 10);
p = NULL;
if (error && (error[0] == '\0') && number > 0)
if (error && !error[0] && number > 0)
{
l = weechat_trigger_list;
while (l && number >= 0)
+39 -24
View File
@@ -45,16 +45,6 @@ struct t_weelist;
#define WEECHAT_RC_ERROR -1 /* function failed with an error */
#define WEECHAT_RC_OK 0 /* function ok */
/* return codes specific to message handlers: messages can be discarded for
WeeChat, for plugins, or both */
#define WEECHAT_RC_OK_IGNORE_WEECHAT 1 /* ignore WeeChat for this message */
#define WEECHAT_RC_OK_IGNORE_PLUGINS 2 /* ignore other plugins for msg */
#define WEECHAT_RC_OK_IGNORE_ALL (WEECHAT_RC_OK_IGNORE_WEECHAT \
| WEECHAT_RC_OK_IGNORE_PLUGINS)
/* ignore WeeChat and other plugins */
#define WEECHAT_RC_OK_WITH_HIGHLIGHT 4 /* ok and ask for highlight */
/* (for message handler only) */
/* list management (order of elements) */
#define WEECHAT_LIST_POS_SORT "sort"
#define WEECHAT_LIST_POS_BEGINNING "beginning"
@@ -105,12 +95,15 @@ struct t_weechat_plugin
int (*strcmp_ignore_chars) (char *string1, char *string2,
char *chars_ignored, int case_sensitive);
char *(*strcasestr) (char *string1, char *string2);
int (*string_match) (char *string, char *mask, int case_sensitive);
char *(*string_replace) (char *string, char *search, char *replace);
char *(*string_remove_quotes) (char *string, char *quotes);
char *(*string_strip) (char *string, int left, int right, char *chars);
char **(*string_explode) (char *string, char *separators, int keep_eol,
int num_items_max, int *num_items);
void (*string_free_exploded) (char **exploded_string);
char *(*string_build_with_exploded) (char **exploded_string,
char *separator);
char **(*string_split_command) (char *command, char separator);
void (*string_free_splitted_command) (char **splitted_command);
@@ -218,8 +211,8 @@ struct t_weechat_plugin
/* display */
char *(*prefix) (char *prefix);
char *(*color) (char *color_name);
void (*printf_date) (struct t_gui_buffer *buffer, time_t date,
char *message, ...);
void (*printf_date_tags) (struct t_gui_buffer *buffer, time_t date,
char *tags, char *message, ...);
void (*infobar_printf) (struct t_weechat_plugin *plugin, int delay,
char *color_name, char *format, ...);
void (*infobar_remove) (int how_many);
@@ -247,11 +240,14 @@ struct t_weechat_plugin
void *callback_data);
struct t_hook *(*hook_print) (struct t_weechat_plugin *plugin,
struct t_gui_buffer *buffer,
char *message, int strip_colors,
char *tags, char *message,
int strip_colors,
int (*callback)(void *data,
struct t_gui_buffer *buffer,
time_t date, char *prefix,
char *message),
time_t date,
int tags_count,
char **tags,
char *prefix, char *message),
void *callback_data);
struct t_hook *(*hook_signal) (struct t_weechat_plugin *plugin,
char *signal,
@@ -298,7 +294,8 @@ struct t_weechat_plugin
void *close_callback_data);
struct t_gui_buffer *(*buffer_search) (char *category, char *name);
void (*buffer_close) (struct t_gui_buffer *buffer, int switch_to_another);
void *(*buffer_get) (struct t_gui_buffer *buffer, char *property);
char *(*buffer_get_string) (struct t_gui_buffer *buffer, char *property);
void *(*buffer_get_pointer) (struct t_gui_buffer *buffer, char *property);
void (*buffer_set) (struct t_gui_buffer *buffer, char *property,
char *value);
@@ -403,6 +400,8 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin);
__case_sensitive)
#define weechat_strcasestr(__string1, __string2) \
weechat_plugin->strcasestr(__string1, __string2)
#define weechat_string_match(__string, __mask, __case_sensitive) \
weechat_plugin->string_match(__string, __mask, __case_sensitive)
#define weechat_string_replace(__string, __search, __replace) \
weechat_plugin->string_replace(__string, __search, __replace)
#define weechat_string_remove_quotes(__string, __quotes) \
@@ -415,6 +414,10 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin);
__max, __num_items)
#define weechat_string_free_exploded(__exploded_string) \
weechat_plugin->string_free_exploded(__exploded_string)
#define weechat_string_build_with_exploded(__exploded_string, \
__separator) \
weechat_plugin->string_build_with_exploded(__exploded_string, \
__separator)
#define weechat_string_split_command(__command, __separator) \
weechat_plugin->string_split_command(__command, __separator)
#define weechat_string_free_splitted_command(__splitted_command) \
@@ -559,9 +562,18 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin);
#define weechat_color(__color_name) \
weechat_plugin->color(__color_name)
#define weechat_printf(__buffer, __message, __argz...) \
weechat_plugin->printf_date(__buffer, 0, __message, ##__argz)
weechat_plugin->printf_date_tags(__buffer, 0, NULL, __message, \
##__argz)
#define weechat_printf_date(__buffer, __date, __message, __argz...) \
weechat_plugin->printf_date(__buffer, __date, __message, ##__argz)
weechat_plugin->printf_date_tags(__buffer, __date, NULL, \
__message, ##__argz)
#define weechat_printf_tags(__buffer, __tags, __message, __argz...) \
weechat_plugin->printf_date_tags(__buffer, 0, __tags, __message, \
##__argz)
#define weechat_printf_date_tags(__buffer, __date, __tags, __message, \
__argz...) \
weechat_plugin->printf_date_tags(__buffer, __date, __tags, \
__message, ##__argz)
#define weechat_infobar_printf(__delay, __color_name, __message, \
__argz...) \
weechat_plugin->infobar_printf(weechat_plugin, __delay, \
@@ -588,10 +600,11 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin);
weechat_plugin->hook_fd(weechat_plugin, __fd, __flag_read, \
__flag_write, __flag_exception, __callback, \
__data)
#define weechat_hook_print(__buffer, __msg, __stri__colors, __callback, \
__data) \
weechat_plugin->hook_print(weechat_plugin, __buffer, __msg, \
__stri__colors, __callback, __data)
#define weechat_hook_print(__buffer, __tags, __msg, __strip__colors, \
__callback, __data) \
weechat_plugin->hook_print(weechat_plugin, __buffer, __tags, \
__msg, __strip__colors, __callback, \
__data)
#define weechat_hook_signal(__signal, __callback, __data) \
weechat_plugin->hook_signal(weechat_plugin, __signal, __callback, \
__data)
@@ -629,8 +642,10 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin);
weechat_plugin->buffer_search(NULL, NULL)
#define weechat_buffer_close(__buffer, __switch_to_another) \
weechat_plugin->buffer_close(__buffer, __switch_to_another)
#define weechat_buffer_get(__buffer, __property) \
weechat_plugin->buffer_get(__buffer, __property)
#define weechat_buffer_get_string(__buffer, __property) \
weechat_plugin->buffer_get_string(__buffer, __property)
#define weechat_buffer_get_pointer(__buffer, __property) \
weechat_plugin->buffer_get_pointer(__buffer, __property)
#define weechat_buffer_set(__buffer, __property, __value) \
weechat_plugin->buffer_set(__buffer, __property, __value)