1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-15 15:44:47 +02:00

Compare commits

...

32 Commits

Author SHA1 Message Date
Sébastien Helleu 4ae396825c Version 4.0.4 2023-08-22 11:43:34 +02:00
Sébastien Helleu 87e47894e6 script: adjust scroll after command /script go N 2023-08-22 11:29:37 +02:00
Sébastien Helleu ad75786e15 core: fix gcc warning on uninitialized variable pos_end
The variable `pos_end` is never used when not initialized anyway, thanks to the
`break` done before.
2023-08-22 10:31:47 +02:00
Sébastien Helleu 39fdb1b564 logger: remove trailing empty line in display of backlog (issue #2002) 2023-08-21 16:02:37 +02:00
Sébastien Helleu c5eb982424 perl: fix display of non-ASCII chars after load of a script with Perl >= 5.38 (issue #1996) 2023-08-21 13:11:58 +02:00
Sébastien Helleu e7bf09f4e8 irc: fix wrong time displayed for CTCP messages received from self nick (issue #2000) 2023-08-18 23:59:42 +02:00
Sébastien Helleu 27972b9c5d scripts: fix tests of functions print_date_tag, print_y_date_tags and hook_timer on 32-bit systems (issue #1999) 2023-08-18 16:45:30 +02:00
Sébastien Helleu ab7b51db72 scripts: fix function string_parse_size on 32-bit systems (python and ruby) (issue #1999) 2023-08-18 16:45:21 +02:00
Sébastien Helleu 647d7033cf xfer: fix conversion of string to IPv4 on 32-bit systems (issue #1999) 2023-08-18 16:44:36 +02:00
Sébastien Helleu 4fe1ba7016 tests: fix tests on function irc_join_compare_join_channel (issue #1997) 2023-08-18 07:55:55 +02:00
Sébastien Helleu 29db9b95ee tests: fix typo in test name 2023-08-18 07:52:36 +02:00
Sébastien Helleu 270d64cfa1 core: fix increment/decrement of options weechat.notify.* 2023-08-18 07:52:13 +02:00
Sébastien Helleu 4eabcdf840 core: fix integer overflow when setting integer option with ++N or --N 2023-08-18 07:49:19 +02:00
Sébastien Helleu 77911680bb irc: fix redirection of command /list when the reply doesn't start with message 321 (start of /list) 2023-08-18 07:40:32 +02:00
Sébastien Helleu bc5b287622 irc: add missing tags on multiline messages (issue #1987) 2023-08-09 14:55:50 +02:00
Sébastien Helleu 7c0b16df81 Version 4.0.4-dev 2023-08-08 21:19:12 +02:00
Sébastien Helleu f3bc66b255 Version 4.0.3 2023-08-08 20:51:54 +02:00
Sébastien Helleu a23d8f2198 relay: fix display of IRC CTCP messages received from client (issue #1986) 2023-08-08 09:42:34 +02:00
Sébastien Helleu f4c6caabb3 tests: add test on IRC notice sent to another nick with channel name at beginning (issue #1991) 2023-08-01 22:49:45 +02:00
Sébastien Helleu f416688e84 irc: fix display of outgoing notice with channel when capability "echo-message" is enabled (issue #1991) 2023-08-01 22:37:10 +02:00
Sébastien Helleu 1dc7ae6b68 core: remove CMake option "ENABLE_DOC_WARN_LOCALE" from release notes (issue #1985) 2023-08-01 08:32:16 +02:00
Sébastien Helleu b06e09d00b core: remove CMake option "ENABLE_DOC_WARN_LOCALE" (issue #1985) 2023-07-31 22:02:18 +02:00
Sébastien Helleu 89090b10e8 core: fix typo 2023-07-31 21:51:19 +02:00
Sébastien Helleu fad7231f90 doc: stop build of docs if a locale is missing, add CMake option "ENABLE_DOC_WARN_LOCALE" (issue #1985) 2023-07-31 21:31:53 +02:00
Sébastien Helleu cf1e073446 core: add missing trailing newline char in doc generation error messages 2023-07-31 08:07:33 +02:00
Sébastien Helleu b4fc345a13 core: add version 4.0.3 in release notes 2023-07-31 08:10:37 +02:00
Sébastien Helleu b2cd9d002b irc: fix switch to channel manually joined (issue #1982)
This happens when server option autojoin_dynamic is on and option
irc.look.buffer_switch_autojoin is off.

Regression was introduced in version 4.0.0 by commit
1c3b871204.
2023-07-31 08:05:26 +02:00
Sébastien Helleu 9312211d49 core: fix input length and crash after delete of line (issue #1989) 2023-07-28 07:19:07 +02:00
Sébastien Helleu 2ad27b41a5 irc: fix memory leak in IRC message parser
Bug was introduced in WeeChat 3.4 by commit
c4b4d80936.
2023-07-20 08:57:50 +02:00
Sébastien Helleu ef68312393 irc: fix display of self CTCP message containing bold attribute (issue #1981) 2023-07-18 18:54:02 +02:00
Sébastien Helleu 7aa490e360 core: add version 4.0.2 in release notes 2023-07-12 22:11:54 +02:00
Sébastien Helleu 36ea983d04 Version 4.0.3-dev 2023-07-12 20:47:52 +02:00
36 changed files with 1043 additions and 271 deletions
+37
View File
@@ -10,6 +10,43 @@ This document lists all the changes for each version. +
For a list of important changes that require manual actions, please look at release notes.
[[v4.0.4]]
== Version 4.0.4 (2023-08-22)
Bug fixes::
* core: fix integer overflow when setting integer option with `++N` or `--N`
* core: fix increment/decrement of options weechat.notify.*
* irc: add missing tags on multiline messages (issue #1987)
* irc: fix redirection of command `/list` when the reply doesn't start with message 321 (start of /list)
* irc: fix wrong time displayed for CTCP messages received from self nick (issue #2000)
* logger: remove trailing empty line in display of backlog (issue #2002)
* perl: fix display of non-ASCII chars after load of a script with Perl >= 5.38 (issue #1996)
* script: adjust scroll after command `/script go N`
* scripts: fix function string_parse_size on 32-bit systems (python and ruby) (issue #1999)
* xfer: fix conversion of string to IPv4 on 32-bit systems (issue #1999)
Tests::
* irc: fix tests on function irc_join_compare_join_channel (issue #1997)
* scripts: fix tests of functions print_date_tag, print_y_date_tags and hook_timer on 32-bit systems (issue #1999)
[[v4.0.3]]
== Version 4.0.3 (2023-08-08)
Bug fixes::
* core: fix input length and crash after delete of line (issue #1989)
* irc: fix display of self CTCP message containing bold attribute (issue #1981)
* irc: fix memory leak in IRC message parser
* irc: fix switch to channel manually joined when server option autojoin_dynamic is on and option irc.look.buffer_switch_autojoin is off (issue #1982)
* irc: fix display of outgoing notice with channel when capability "echo-message" is enabled (issue #1991)
* relay: fix display of IRC CTCP messages received from client (issue #1986)
Build::
* doc: display a warning if a locale is missing with fallback to English for auto-generated content (issue #1985)
[[v4.0.2]]
== Version 4.0.2 (2023-07-12)
+46 -31
View File
@@ -11,6 +11,21 @@ It is recommended to read it when upgrading to a new stable version. +
For a complete list of changes, please look at ChangeLog.
[[v4.0.4]]
== Version 4.0.4 (2023-08-22)
No release notes.
[[v4.0.3]]
== Version 4.0.3 (2023-08-08)
No release notes.
[[v4.0.2]]
== Version 4.0.2 (2023-07-12)
No release notes.
[[v4.0.1]]
== Version 4.0.1 (2023-06-30)
@@ -473,7 +488,7 @@ now any return value is ignored (like it has always been in the C API).
[[v3.7.1]]
== Version 3.7.1 (2022-10-21)
Bug fix and maintenance release.
No release notes.
[[v3.7]]
== Version 3.7 (2022-10-09)
@@ -595,7 +610,7 @@ and is now a percentage between `0` and `100`:
[[v3.4.1]]
== Version 3.4.1 (2022-03-13)
Bug fix and maintenance release.
No release notes.
[[v3.4]]
== Version 3.4 (2021-12-18)
@@ -753,7 +768,7 @@ For example:
[[v3.2.1]]
== Version 3.2.1 (2021-09-04)
Bug fix and maintenance release.
No release notes.
[[v3.2]]
== Version 3.2 (2021-06-13)
@@ -983,7 +998,7 @@ must adjust the value of the new option, which defaults to 1:
[[v3.0.1]]
== Version 3.0.1 (2021-01-31)
Bug fix and maintenance release.
No release notes.
[[v3.0]]
== Version 3.0 (2020-11-11)
@@ -1291,7 +1306,7 @@ version:
[[v2.7.1]]
== Version 2.7.1 (2020-02-20)
Bug fix and maintenance release.
No release notes.
[[v2.7]]
== Version 2.7 (2019-12-08)
@@ -1535,7 +1550,7 @@ Functions removed from C API:
[[v2.3]]
== Version 2.3 (2018-10-21)
No release note.
No release notes.
[[v2.2]]
== Version 2.2 (2018-07-14)
@@ -1671,7 +1686,7 @@ List of options moved:
[[v2.0.1]]
== Version 2.0.1 (2017-12-20)
Bug fix and maintenance release.
No release notes.
[[v2.0]]
== Version 2.0 (2017-12-03)
@@ -1766,12 +1781,12 @@ to integer before using it, for example in Python: `int(fd)`.
[[v1.9.1]]
== Version 1.9.1 (2017-09-23)
Bug fix and maintenance release.
No release notes.
[[v1.9]]
== Version 1.9 (2017-06-25)
No release note.
No release notes.
[[v1.8]]
== Version 1.8 (2017-05-13)
@@ -1823,7 +1838,7 @@ Aspell option with color for suggestion on a misspelled word has been renamed:
[[v1.7.1]]
== Version 1.7.1 (2017-04-22)
Bug fix and maintenance release.
No release notes.
[[v1.7]]
== Version 1.7 (2017-01-15)
@@ -2070,7 +2085,7 @@ command:
[[v1.1.1]]
== Version 1.1.1 (2015-01-25)
Bug fix and maintenance release.
No release notes.
[[v1.1]]
== Version 1.1 (2015-01-11)
@@ -2190,7 +2205,7 @@ instead of milliseconds:
[[v1.0.1]]
== Version 1.0.1 (2014-09-28)
Bug fix and maintenance release.
No release notes.
[[v1.0]]
== Version 1.0 (2014-08-15)
@@ -3016,17 +3031,17 @@ This version fixes a major bug: crash with some special chars in IRC messages.
[[v0.2.6]]
== Version 0.2.6 (2007-09-06)
No release note.
No release notes.
[[v0.2.5]]
== Version 0.2.5 (2007-06-07)
No release note.
No release notes.
[[v0.2.4]]
== Version 0.2.4 (2007-03-29)
No release note.
No release notes.
[[v0.2.3]]
== Version 0.2.3 (2007-01-10)
@@ -3085,7 +3100,7 @@ Which gives something like:
[[v0.2.1]]
== Version 0.2.1 (2006-10-01)
No release note.
No release notes.
[[v0.2.0]]
== Version 0.2.0 (2006-08-19)
@@ -3199,74 +3214,74 @@ at startup.
[[v0.1.5]]
== Version 0.1.5 (2005-09-24)
No release note.
No release notes.
[[v0.1.4]]
== Version 0.1.4 (2005-07-30)
No release note.
No release notes.
[[v0.1.3]]
== Version 0.1.3 (2005-07-02)
No release note.
No release notes.
[[v0.1.2]]
== Version 0.1.2 (2005-05-21)
No release note.
No release notes.
[[v0.1.1]]
== Version 0.1.1 (2005-03-20)
No release note.
No release notes.
[[v0.1.0]]
== Version 0.1.0 (2005-02-12)
No release note.
No release notes.
[[v0.0.9]]
== Version 0.0.9 (2005-01-01)
No release note.
No release notes.
[[v0.0.8]]
== Version 0.0.8 (2004-10-30)
No release note.
No release notes.
[[v0.0.7]]
== Version 0.0.7 (2004-08-08)
No release note.
No release notes.
[[v0.0.6]]
== Version 0.0.6 (2004-06-05)
No release note.
No release notes.
[[v0.0.5]]
== Version 0.0.5 (2004-02-07)
No release note.
No release notes.
[[v0.0.4]]
== Version 0.0.4 (2004-01-01)
No release note.
No release notes.
[[v0.0.3]]
== Version 0.0.3 (2003-11-03)
No release note.
No release notes.
[[v0.0.2]]
== Version 0.0.2 (2003-10-05)
No release note.
No release notes.
[[v0.0.1]]
== Version 0.0.1 (2003-09-27)
No release note.
No release notes.
+6 -6
View File
@@ -1527,22 +1527,22 @@ config_file_option_set (struct t_config_option *option, const char *value,
{
error = NULL;
number = strtol (value + 2, &error, 10);
if (error && !error[0])
if (error && !error[0]
&& (long)old_value + number <= (long)(option->max))
{
value_int = old_value + number;
if (value_int <= option->max)
new_value_ok = 1;
new_value_ok = 1;
}
}
else if (strncmp (value, "--", 2) == 0)
{
error = NULL;
number = strtol (value + 2, &error, 10);
if (error && !error[0])
if (error && !error[0]
&& (long)old_value - number >= (long)(option->min))
{
value_int = old_value - number;
if (value_int >= option->min)
new_value_ok = 1;
new_value_ok = 1;
}
}
else
+1 -22
View File
@@ -2466,27 +2466,6 @@ config_weechat_layout_write_cb (const void *pointer, void *data,
return WEECHAT_CONFIG_WRITE_OK;
}
/*
* Checks notify option value.
*
* Returns:
* 1: value OK
* 0: invalid value
*/
int
config_weechat_notify_check_cb (const void *pointer, void *data,
struct t_config_option *option,
const char *value)
{
/* make C compiler happy */
(void) pointer;
(void) data;
(void) option;
return (gui_buffer_search_notify (value) >= 0) ? 1 : 0;
}
/*
* Callback for changes on a notify option.
*/
@@ -2549,7 +2528,7 @@ config_weechat_notify_create_option_cb (const void *pointer, void *data,
option_name, "integer", _("Notify level for buffer"),
"none|highlight|message|all",
0, 0, "", value, 0,
&config_weechat_notify_check_cb, NULL, NULL,
NULL, NULL, NULL,
&config_weechat_notify_change_cb, NULL, NULL,
NULL, NULL, NULL);
rc = (ptr_option) ?
+13 -3
View File
@@ -126,7 +126,7 @@ doc_gen_open_file (const char *path, const char *doc, const char *name,
if (!file)
{
string_fprintf (stderr,
"doc generator: ERROR: unable to write file \"%s\"",
"doc generator: ERROR: unable to write file \"%s\"\n",
filename);
return NULL;
}
@@ -1652,7 +1652,7 @@ doc_generate (const char *path)
{
string_fprintf (
stderr,
"doc generator: ERROR: failed to create directory \"%s\")",
"doc generator: ERROR: failed to create directory \"%s\")\n",
path);
goto end;
}
@@ -1669,7 +1669,17 @@ doc_generate (const char *path)
for (i = 0; locales[i]; i++)
{
setenv ("LANGUAGE", locales[i], 1);
setlocale (LC_ALL, locales[i]);
if (!setlocale (LC_ALL, locales[i]))
{
/* warning on missing locale */
string_fprintf (
stderr,
"doc generator: WARNING: failed to set locale \"%s\", "
"docs will include auto-generated English content\n",
locales[i]);
/* fallback to English */
setlocale (LC_ALL, "C");
}
memcpy (lang, locales[i], 2);
lang[2] = '\0';
for (j = 0; doc_gen_functions[j]; j++)
+3 -3
View File
@@ -862,7 +862,7 @@ gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date,
{
time_t date_printed;
char *pos, *pos_end;
int one_line = 0;
int one_line;
if (!message)
return;
@@ -885,9 +885,11 @@ gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date,
if (date <= 0)
date = date_printed;
one_line = 0;
pos = vbuffer;
while (pos)
{
pos_end = NULL;
if (!buffer || !buffer->input_multiline)
{
/* display until next end of line */
@@ -911,9 +913,7 @@ gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date,
}
if (one_line)
{
break;
}
pos = (pos_end && pos_end[1]) ? pos_end + 1 : NULL;
}
+1 -1
View File
@@ -1142,7 +1142,7 @@ gui_input_delete_line (struct t_gui_buffer *buffer)
end_of_line = (char *)utf8_end_of_line (start);
size_deleted = end_of_line - beginning_of_line;
length_deleted = utf8_strnlen (start, size_deleted);
length_deleted = utf8_strnlen (beginning_of_line, size_deleted);
memmove (beginning_of_line, end_of_line, strlen (end_of_line));
+19 -7
View File
@@ -110,7 +110,7 @@ irc_batch_add_to_list (struct t_irc_server *server, struct t_irc_batch *batch)
struct t_irc_batch *
irc_batch_start_batch (struct t_irc_server *server, const char *reference,
const char *parent_ref, const char *type,
const char *parameters)
const char *parameters, struct t_hashtable *tags)
{
struct t_irc_batch *ptr_batch;
@@ -130,6 +130,7 @@ irc_batch_start_batch (struct t_irc_server *server, const char *reference,
ptr_batch->parent_ref = (parent_ref) ? strdup (parent_ref) : NULL;
ptr_batch->type = strdup (type);
ptr_batch->parameters = (parameters) ? strdup (parameters) : NULL;
ptr_batch->tags = (tags) ? weechat_hashtable_dup (tags) : NULL;
ptr_batch->start_time = time (NULL);
ptr_batch->messages = NULL;
ptr_batch->end_received = 0;
@@ -188,6 +189,8 @@ irc_batch_free (struct t_irc_server *server, struct t_irc_batch *batch)
free (batch->type);
if (batch->parameters)
free (batch->parameters);
if (batch->tags)
weechat_hashtable_free (batch->tags);
if (batch->messages)
weechat_string_dyn_free (batch->messages, 1);
@@ -226,7 +229,7 @@ irc_batch_process_messages (struct t_irc_server *server,
struct t_irc_batch *batch)
{
char **list_messages, *command, *channel, modifier_data[1024], *new_messages;
char *message;
char *message, *message2;
int i, count_messages;
if (!batch || !batch->messages)
@@ -261,8 +264,13 @@ irc_batch_process_messages (struct t_irc_server *server,
if (!message)
continue;
message2 = irc_tag_add_tags_to_message (message,
batch->tags);
if (!message2)
continue;
irc_message_parse (server,
message,
message2,
NULL, /* tags */
NULL, /* message_without_tags */
NULL, /* nick */
@@ -280,13 +288,13 @@ irc_batch_process_messages (struct t_irc_server *server,
NULL); /* pos_text */
/* add raw message */
irc_raw_print (server, IRC_RAW_FLAG_RECV, message);
irc_raw_print (server, IRC_RAW_FLAG_RECV, message2);
/* call receive callback, ignoring batch tags */
irc_protocol_recv_command (server, message, command, channel, 1);
irc_protocol_recv_command (server, message2, command, channel, 1);
if (message)
free (message);
free (message);
free (message2);
if (command)
free (command);
if (channel)
@@ -562,6 +570,10 @@ irc_batch_print_log (struct t_irc_server *server)
weechat_log_printf (" parent_ref. . . . . : '%s'", ptr_batch->parent_ref);
weechat_log_printf (" type. . . . . . . . : '%s'", ptr_batch->type);
weechat_log_printf (" parameters. . . . . : '%s'", ptr_batch->parameters);
weechat_log_printf (" tags. . . . . . . . : 0x%lx (hashtable: '%s')",
ptr_batch->tags,
weechat_hashtable_get_string (ptr_batch->tags,
"keys_values"));
weechat_log_printf (" start_time. . . . . : %lld", (long long)ptr_batch->start_time);
weechat_log_printf (" message . . . . . . : 0x%lx ('%s')",
ptr_batch->messages,
+4 -1
View File
@@ -22,6 +22,7 @@
#include <time.h>
struct t_hashtable;
struct t_irc_server;
struct t_irc_batch
@@ -30,6 +31,7 @@ struct t_irc_batch
char *parent_ref; /* ref of parent batch (optional) */
char *type; /* type */
char *parameters; /* parameters */
struct t_hashtable *tags; /* batch message tags */
time_t start_time; /* start time (to auto-purge if */
/* batch end is not received) */
char **messages; /* messages separated by '\n' */
@@ -46,7 +48,8 @@ extern struct t_irc_batch *irc_batch_start_batch (struct t_irc_server *server,
const char *reference,
const char *parent_ref,
const char *type,
const char *parameters);
const char *parameters,
struct t_hashtable *tags);
extern int irc_batch_add_message (struct t_irc_server *server,
const char *reference,
const char *irc_message);
+1 -1
View File
@@ -462,7 +462,7 @@ irc_channel_create_buffer (struct t_irc_server *server,
if (noswitch
|| (!manual_join && !autojoin_join)
|| (manual_join && !weechat_config_boolean (irc_config_look_buffer_switch_join))
|| (autojoin_join && !weechat_config_boolean (irc_config_look_buffer_switch_autojoin)))
|| (!manual_join && autojoin_join && !weechat_config_boolean (irc_config_look_buffer_switch_autojoin)))
{
switch_to_channel = 0;
}
+6
View File
@@ -385,6 +385,7 @@ irc_command_me_channel_message (struct t_irc_server *server,
{
irc_input_user_message_display (
server,
0, /* date */
channel_name,
NULL, /* address */
"privmsg",
@@ -1970,6 +1971,7 @@ IRC_COMMAND_CALLBACK(ctcp)
{
irc_input_user_message_display (
ptr_server,
0, /* date */
ctcp_target,
NULL, /* address */
"privmsg",
@@ -3735,6 +3737,7 @@ IRC_COMMAND_CALLBACK(msg)
{
irc_input_user_message_display (
ptr_server,
0, /* date */
ptr_channel->name,
NULL, /* address */
"privmsg",
@@ -3755,6 +3758,7 @@ IRC_COMMAND_CALLBACK(msg)
{
irc_input_user_message_display (
ptr_server,
0, /* date */
targets[i],
NULL, /* address */
"privmsg",
@@ -3910,6 +3914,7 @@ IRC_COMMAND_CALLBACK(notice)
ptr_message = (const char *)weechat_arraylist_get (list_messages, i);
irc_input_user_message_display (
ptr_server,
0, /* date */
argv[arg_target],
NULL, /* address */
"notice",
@@ -4439,6 +4444,7 @@ IRC_COMMAND_CALLBACK(query)
{
irc_input_user_message_display (
ptr_server,
0, /* date */
ptr_channel->name,
NULL, /* address */
"privmsg",
+7 -5
View File
@@ -62,6 +62,7 @@
void
irc_input_user_message_display (struct t_irc_server *server,
time_t date,
const char *target,
const char *address,
const char *command,
@@ -162,7 +163,7 @@ irc_input_user_message_display (struct t_irc_server *server,
{
weechat_printf_date_tags (
ptr_buffer,
0,
date,
irc_protocol_tags (
server,
command,
@@ -189,7 +190,7 @@ irc_input_user_message_display (struct t_irc_server *server,
{
weechat_printf_date_tags (
ptr_buffer,
0,
date,
irc_protocol_tags (
server,
command,
@@ -211,7 +212,7 @@ irc_input_user_message_display (struct t_irc_server *server,
{
weechat_printf_date_tags (
ptr_buffer,
0,
date,
irc_protocol_tags (
server,
command,
@@ -235,7 +236,7 @@ irc_input_user_message_display (struct t_irc_server *server,
{
weechat_printf_date_tags (
ptr_buffer,
0,
date,
irc_protocol_tags (
server,
command,
@@ -267,7 +268,7 @@ irc_input_user_message_display (struct t_irc_server *server,
{
weechat_printf_date_tags (
ptr_buffer,
0,
date,
irc_protocol_tags (
server,
command,
@@ -333,6 +334,7 @@ irc_input_send_user_message (struct t_gui_buffer *buffer, int flags,
{
irc_input_user_message_display (
ptr_server,
0, /* date */
ptr_channel->name,
NULL, /* address */
"privmsg",
+3
View File
@@ -20,9 +20,12 @@
#ifndef WEECHAT_PLUGIN_IRC_INPUT_H
#define WEECHAT_PLUGIN_IRC_INPUT_H
#include <time.h>
struct t_gui_buffer;
extern void irc_input_user_message_display (struct t_irc_server *server,
time_t date,
const char *target,
const char *address,
const char *command,
+2
View File
@@ -529,6 +529,8 @@ irc_message_parse_to_hashtable (struct t_irc_server *server,
free (arguments);
if (text)
free (text);
if (params)
weechat_string_free_split (params);
return hashtable;
}
+11 -5
View File
@@ -688,7 +688,8 @@ IRC_PROTOCOL_CALLBACK(batch)
params[0] + 1, /* reference */
weechat_hashtable_get (tags, "batch"), /* parent ref */
params[1], /* type */
str_params);
str_params,
tags);
if (str_params)
free (str_params);
}
@@ -2505,8 +2506,11 @@ IRC_PROTOCOL_CALLBACK(notice)
is_channel = irc_channel_is_channel (server, pos_target);
is_channel_orig = is_channel;
if (is_channel)
{
channel = strdup (pos_target);
else if (weechat_config_boolean (irc_config_look_notice_welcome_redirect))
}
else if (weechat_config_boolean (irc_config_look_notice_welcome_redirect)
&& (irc_server_strcasecmp (server, server->nick, pos_target) == 0))
{
end_char = ' ';
switch (pos_args[0])
@@ -2985,6 +2989,7 @@ IRC_PROTOCOL_CALLBACK(pong)
void
irc_protocol_privmsg_display_ctcp_send (struct t_irc_server *server,
time_t date,
const char *target,
const char *address,
const char *arguments)
@@ -2995,7 +3000,7 @@ irc_protocol_privmsg_display_ctcp_send (struct t_irc_server *server,
if (!arguments || !arguments[0])
return;
pos_end = strchr (arguments + 1, '\01');
pos_end = strrchr (arguments + 1, '\01');
if (!pos_end)
return;
@@ -3010,6 +3015,7 @@ irc_protocol_privmsg_display_ctcp_send (struct t_irc_server *server,
irc_input_user_message_display (
server,
date,
target,
address,
"privmsg",
@@ -3089,7 +3095,7 @@ IRC_PROTOCOL_CALLBACK(privmsg)
if (nick_is_me)
{
irc_protocol_privmsg_display_ctcp_send (
server, params[0], address, msg_args);
server, date, params[0], address, msg_args);
}
else
{
@@ -3207,7 +3213,7 @@ IRC_PROTOCOL_CALLBACK(privmsg)
if (nick_is_me && cap_echo_message && !msg_already_received)
{
irc_protocol_privmsg_display_ctcp_send (
server, remote_nick, address, msg_args);
server, date, remote_nick, address, msg_args);
}
else
{
+1 -1
View File
@@ -55,7 +55,7 @@ struct t_irc_redirect_pattern irc_redirect_patterns_default[] =
* stop: 323: end of /list
* extra: -
*/
"321",
"321,322",
"323",
NULL,
NULL, NULL,
+156
View File
@@ -283,3 +283,159 @@ irc_tag_parse (const char *tags,
return num_tags;
}
/*
* Adds tags to a dynamic string, separated by semicolons, with escaped
* tag values.
*/
void
irc_tag_add_to_string_cb (void *data,
struct t_hashtable *hashtable,
const void *key,
const void *value)
{
char **string, *escaped;
/* make C compiler happy */
(void) hashtable;
string = (char **)data;
if (*string[0])
weechat_string_dyn_concat (string, ";", -1);
weechat_string_dyn_concat (string, key, -1);
if (value)
{
weechat_string_dyn_concat (string, "=", -1);
escaped = irc_tag_escape_value ((const char *)value);
weechat_string_dyn_concat (string,
(escaped) ? escaped : (const char *)value,
-1);
if (escaped)
free (escaped);
}
}
/*
* Converts hashtable with tags to a string (tags and values are escaped).
*
* Note: result must be freed after use.
*/
char *
irc_tag_hashtable_to_string (struct t_hashtable *tags)
{
char **string;
if (!tags)
return NULL;
string = weechat_string_dyn_alloc (64);
if (!string)
return NULL;
weechat_hashtable_map (tags, &irc_tag_add_to_string_cb, string);
return weechat_string_dyn_free (string, 0);
}
/*
* Adds tags to another hashtable.
*/
void
irc_tag_add_to_hashtable_cb (void *data,
struct t_hashtable *hashtable,
const void *key,
const void *value)
{
/* make C compiler happy */
(void) hashtable;
if (!weechat_hashtable_has_key ((struct t_hashtable *)data, key))
weechat_hashtable_set ((struct t_hashtable *)data, key, value);
}
/*
* Adds tags to an IRC message.
* Existing tags in message are kept unchanged.
*
* Note: result must be freed after use.
*/
char *
irc_tag_add_tags_to_message (const char *message, struct t_hashtable *tags)
{
char *msg_str_tags, **result, *new_tags;
const char *pos_space, *ptr_message;
struct t_hashtable *msg_hash_tags;
if (!message)
return NULL;
if (!tags)
return strdup (message);
result = NULL;
msg_str_tags = NULL;
msg_hash_tags = NULL;
new_tags = NULL;
if (message[0] == '@')
{
pos_space = strchr (message, ' ');
if (!pos_space)
goto end;
msg_str_tags = weechat_strndup (message + 1, pos_space - message - 1);
ptr_message = pos_space + 1;
while (ptr_message[0] == ' ')
{
ptr_message++;
}
}
else
{
ptr_message = message;
}
msg_hash_tags = weechat_hashtable_new (32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
if (!msg_hash_tags)
goto end;
if (msg_str_tags)
irc_tag_parse (msg_str_tags, msg_hash_tags, NULL);
weechat_hashtable_map (tags, &irc_tag_add_to_hashtable_cb, msg_hash_tags);
result = weechat_string_dyn_alloc (64);
if (!result)
goto end;
new_tags = irc_tag_hashtable_to_string (msg_hash_tags);
if (!new_tags)
goto end;
if (new_tags[0])
{
weechat_string_dyn_concat (result, "@", -1);
weechat_string_dyn_concat (result, new_tags, -1);
weechat_string_dyn_concat (result, " ", -1);
}
weechat_string_dyn_concat (result, ptr_message, -1);
end:
if (msg_str_tags)
free (msg_str_tags);
if (msg_hash_tags)
weechat_hashtable_free (msg_hash_tags);
if (new_tags)
free (new_tags);
return (result) ? weechat_string_dyn_free (result, 0) : NULL;
}
+2
View File
@@ -30,5 +30,7 @@ extern char *irc_tag_modifier_cb (const void *pointer,
extern int irc_tag_parse (const char *tags,
struct t_hashtable *hashtable,
const char *prefix_key);
extern char *irc_tag_add_tags_to_message (const char *message,
struct t_hashtable *tags);
#endif /* WEECHAT_PLUGIN_IRC_TAG_H */
+35 -17
View File
@@ -168,7 +168,7 @@ struct t_arraylist *
logger_backlog_group_messages (struct t_arraylist *lines)
{
int i, size, time_found;
char **message, **old_message, *str_date, *error;
char *message, *new_message, *str_date, *error;
const char *ptr_line, *pos_message;
struct tm tm_line;
struct t_arraylist *messages;
@@ -176,27 +176,37 @@ logger_backlog_group_messages (struct t_arraylist *lines)
if (!lines)
return NULL;
message = NULL;
size = weechat_arraylist_size (lines);
messages = weechat_arraylist_new (size, 0, 1,
&logger_backlog_msg_cmp_cb, NULL,
&logger_backlog_msg_free_cb, NULL);
if (!messages)
return NULL;
message = weechat_string_dyn_alloc (256);
old_message = weechat_string_dyn_alloc (256);
goto error;
for (i = size - 1; i >= 0; i--)
{
ptr_line = (const char *)weechat_arraylist_get (lines, i);
weechat_string_dyn_copy (old_message, *message);
weechat_string_dyn_copy (message, ptr_line);
if ((*old_message)[0])
if (message)
{
weechat_string_dyn_concat (message, "\n", -1);
weechat_string_dyn_concat (message, *old_message, -1);
new_message = malloc (strlen (ptr_line) + 1 + strlen (message) + 1);
if (!new_message)
goto error;
strcpy (new_message, ptr_line);
strcat (new_message, "\n");
strcat (new_message, message);
free (message);
message = new_message;
}
else
{
message = malloc (strlen (ptr_line) + 1);
if (!message)
goto error;
strcpy (message, ptr_line);
}
time_found = 0;
@@ -218,18 +228,26 @@ logger_backlog_group_messages (struct t_arraylist *lines)
}
if (time_found)
{
weechat_arraylist_insert (messages, 0, strdup (*message));
weechat_string_dyn_copy (message, NULL);
/* add message (will be freed when arraylist is destroyed) */
weechat_arraylist_insert (messages, 0, message);
message = NULL;
}
}
if ((*message)[0])
weechat_arraylist_insert (messages, 0, strdup (*message));
weechat_string_dyn_free (message, 1);
weechat_string_dyn_free (old_message, 1);
if (message)
{
/* add message (will be freed when arraylist is destroyed) */
weechat_arraylist_insert (messages, 0, message);
}
return messages;
error:
if (message)
free (message);
if (messages)
weechat_arraylist_free (messages);
return NULL;
}
/*
+60 -64
View File
@@ -100,7 +100,7 @@ logger_tail_lines_free_cb (void *data, struct t_arraylist *arraylist,
struct t_arraylist *
logger_tail_file (const char *filename, int lines)
{
int fd;
int fd, count_read;
off_t file_length, file_pos;
size_t to_read;
ssize_t bytes_read;
@@ -108,21 +108,30 @@ logger_tail_file (const char *filename, int lines)
char *ptr_buf, *pos_eol, *part_of_line, *new_part_of_line, *line;
struct t_arraylist *list_lines;
if (!filename || (lines < 1))
if (!filename || !filename[0] || (lines < 1))
return NULL;
fd = -1;
part_of_line = 0;
list_lines = NULL;
/* allocate arraylist */
list_lines = weechat_arraylist_new (lines, 0, 1,
&logger_tail_lines_cmp_cb, NULL,
&logger_tail_lines_free_cb, NULL);
if (!list_lines)
goto error;
/* open file */
fd = open (filename, O_RDONLY);
if (fd == -1)
return NULL;
goto error;
/* seek to the end of file */
count_read = 0;
file_length = lseek (fd, (off_t)0, SEEK_END);
if (file_length <= 0)
{
close (fd);
return NULL;
}
goto error;
to_read = file_length;
file_pos = file_length - LOGGER_TAIL_BUFSIZE;
if (file_pos < 0)
@@ -132,71 +141,51 @@ logger_tail_file (const char *filename, int lines)
lseek (fd, file_pos, SEEK_SET);
/* loop until we have "lines" lines in list */
part_of_line = NULL;
list_lines = weechat_arraylist_new (lines, 0, 1,
&logger_tail_lines_cmp_cb, NULL,
&logger_tail_lines_free_cb, NULL);
while (lines > 0)
{
lseek (fd, file_pos, SEEK_SET);
bytes_read = read (fd, buf, to_read);
if (bytes_read <= 0)
{
if (part_of_line)
free (part_of_line);
weechat_arraylist_free (list_lines);
close (fd);
return NULL;
}
goto error;
count_read++;
buf[bytes_read] = '\0';
if ((count_read == 1)
&& ((buf[bytes_read - 1] == '\n') || (buf[bytes_read - 1] == '\r')))
{
/* ignore last new line of the file (on first block read only) */
buf[bytes_read - 1] = '\0';
bytes_read--;
}
ptr_buf = buf + bytes_read - 1;
while (ptr_buf && (ptr_buf >= buf))
{
pos_eol = (char *)logger_tail_last_eol (buf, ptr_buf);
if ((pos_eol && (pos_eol[1] || part_of_line)) || (file_pos == 0))
if (pos_eol)
{
/* use data and part_of_line (if existing) to build a new line */
if (!pos_eol)
ptr_buf = pos_eol - 1;
pos_eol[0] = '\0';
pos_eol++;
if (part_of_line)
{
ptr_buf = NULL;
pos_eol = buf;
line = malloc ((strlen (pos_eol) +
strlen (part_of_line) + 1));
if (!line)
goto error;
strcpy (line, pos_eol);
strcat (line, part_of_line);
free (part_of_line);
part_of_line = NULL;
weechat_arraylist_insert (list_lines, 0, line);
}
else
{
ptr_buf = pos_eol - 1;
pos_eol[0] = '\0';
pos_eol++;
}
if (part_of_line || pos_eol[0])
{
if (part_of_line)
{
line = malloc ((strlen (pos_eol) +
strlen (part_of_line) + 1));
if (!line)
{
free (part_of_line);
weechat_arraylist_free (list_lines);
close (fd);
return NULL;
}
strcpy (line, pos_eol);
strcat (line, part_of_line);
free (part_of_line);
part_of_line = NULL;
weechat_arraylist_insert (list_lines, 0, line);
}
else
{
weechat_arraylist_insert (list_lines, 0,
strdup (pos_eol));
}
lines--;
if (lines <= 0)
break;
weechat_arraylist_insert (list_lines, 0, strdup (pos_eol));
}
lines--;
if (lines <= 0)
break;
}
else if (!pos_eol)
else
{
/*
* beginning of read buffer reached without EOL, then we
@@ -206,12 +195,7 @@ logger_tail_file (const char *filename, int lines)
{
new_part_of_line = malloc (strlen (buf) + strlen (part_of_line) + 1);
if (!new_part_of_line)
{
free (part_of_line);
weechat_arraylist_free (list_lines);
close (fd);
return NULL;
}
goto error;
strcpy (new_part_of_line, buf);
strcat (new_part_of_line, part_of_line);
free (part_of_line);
@@ -220,12 +204,12 @@ logger_tail_file (const char *filename, int lines)
else
{
part_of_line = malloc (strlen (buf) + 1);
if (!part_of_line)
goto error;
strcpy (part_of_line, buf);
}
ptr_buf = NULL;
}
else
ptr_buf = pos_eol - 1;
}
if (file_pos == 0)
break;
@@ -238,9 +222,21 @@ logger_tail_file (const char *filename, int lines)
}
if (part_of_line)
free (part_of_line);
{
/* add part of line (will be freed when arraylist is destroyed) */
weechat_arraylist_insert (list_lines, 0, part_of_line);
}
close (fd);
return list_lines;
error:
if (part_of_line)
free (part_of_line);
if (list_lines)
weechat_arraylist_free (list_lines);
if (fd >= 0)
close (fd);
return NULL;
}
+9
View File
@@ -22,6 +22,7 @@
#undef _
#include <locale.h>
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>
@@ -567,6 +568,10 @@ weechat_perl_load (const char *filename, const char *code)
temp_script.interpreter = (PerlInterpreter *) perl_current_interpreter;
perl_parse (perl_current_interpreter, weechat_perl_api_init,
perl_args_count, perl_args, NULL);
#if PERL_REVISION >= 6 || (PERL_REVISION == 5 && PERL_VERSION >= 38)
/* restore the locale that could be changed by Perl >= 5.38 */
Perl_setlocale (LC_CTYPE, "");
#endif
length = strlen (perl_weechat_code) + strlen (str_warning) +
strlen (str_error) - 2 + 4 + strlen ((code) ? code : filename) + 4 + 1;
perl_code = malloc (length);
@@ -1290,6 +1295,10 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[])
perl_construct (perl_main);
perl_parse (perl_main, weechat_perl_api_init, perl_args_count,
perl_args, NULL);
#if PERL_REVISION >= 6 || (PERL_REVISION == 5 && PERL_VERSION >= 38)
/* restore the locale that could be changed by Perl >= 5.38 */
Perl_setlocale (LC_CTYPE, "");
#endif
#endif /* MULTIPLICITY */
perl_data.config_file = &perl_config_file;
+5 -3
View File
@@ -80,6 +80,8 @@
return PyLong_FromLong((long)__int)
#define API_RETURN_LONG(__long) \
return PyLong_FromLong(__long)
#define API_RETURN_LONGLONG(__longlong) \
return PyLong_FromLongLong(__longlong)
/*
@@ -374,14 +376,14 @@ API_FUNC(string_parse_size)
char *size;
unsigned long long value;
API_INIT_FUNC(1, "string_parse_size", API_RETURN_LONG(0));
API_INIT_FUNC(1, "string_parse_size", API_RETURN_LONGLONG(0));
size = NULL;
if (!PyArg_ParseTuple (args, "s", &size))
API_WRONG_ARGS(API_RETURN_LONG(0));
API_WRONG_ARGS(API_RETURN_LONGLONG(0));
value = weechat_string_parse_size (size);
API_RETURN_LONG(value);
API_RETURN_LONGLONG(value);
}
API_FUNC(string_color_code_size)
+92 -10
View File
@@ -1581,6 +1581,53 @@ relay_irc_recv_command_capab (struct t_relay_client *client,
}
}
/*
* Parses CTCP message and return CTCP type and parameters.
* If message is not a valid CTCP format, type and parameters are set to NULL.
*
* Examples:
*
* message | type | params
* --------------------------|-----------|-----------
* "\01ACTION is testing\01" | "ACTION" | "is testing"
* "\01VERSION\01" | "VERSION" | NULL
* "\01VERSION" | NULL | NULL
* "test" | NULL | NULL
*/
void
relay_irc_parse_ctcp (const char *message, char **ctcp_type, char **ctcp_params)
{
const char *pos_space, *pos_end;
if (!ctcp_type || !ctcp_params)
return;
*ctcp_type = NULL;
*ctcp_params = NULL;
if (!message)
return;
if (message[0] != '\01')
return;
pos_end = strrchr (message + 1, '\01');
if (!pos_end)
return;
pos_space = strchr (message, ' ' );
if (pos_space && (pos_space < pos_end))
{
*ctcp_type = weechat_strndup (message + 1, pos_space - message - 1);
*ctcp_params = weechat_strndup (pos_space + 1, pos_end - pos_space - 1);
}
else
{
*ctcp_type = weechat_strndup (message + 1, pos_end - message - 1);
}
}
/*
* Reads one message from client.
*/
@@ -1595,7 +1642,7 @@ relay_irc_recv (struct t_relay_client *client, const char *data)
char str_time[128], str_signal[128], str_server_channel[256], *nick;
char str_param[128], *str_args, *version, str_command[128], **params;
char *pos, *password, *irc_is_channel, *info, *error, *str_cmd_lower;
char modifier_data[128], *new_data;
char modifier_data[128], *new_data, *ctcp_type, *ctcp_params;
long num_params;
int i, redirect_msg;
@@ -1933,26 +1980,61 @@ relay_irc_recv (struct t_relay_client *client, const char *data)
{
str_args = weechat_string_rebuild_split_string (
(const char **)params, " ", 1, -1);
relay_irc_parse_ctcp (str_args, &ctcp_type, &ctcp_params);
irc_is_channel = weechat_info_get ("irc_is_channel", params[0]);
if (irc_is_channel && (strcmp (irc_is_channel, "1") == 0))
{
relay_irc_input_send (client, params[0],
"priority_high,user_message",
"%s",
(str_args) ? str_args : "");
if (ctcp_type)
{
relay_irc_input_send (client, NULL,
"priority_high",
"/ctcp %s %s%s%s",
params[0],
ctcp_type,
(ctcp_params) ? " " : "",
(ctcp_params) ? ctcp_params : "");
}
else
{
relay_irc_input_send (client, params[0],
"priority_high,user_message",
"%s",
(str_args) ? str_args : "");
}
}
else
{
relay_irc_input_send (client, NULL,
"priority_high",
"/query %s %s",
params[0],
(str_args) ? str_args : "");
if (ctcp_type)
{
relay_irc_input_send (client, NULL,
"priority_high",
"/query %s",
params[0]);
relay_irc_input_send (client, NULL,
"priority_high",
"/ctcp %s %s%s%s",
params[0],
ctcp_type,
(ctcp_params) ? " " : "",
(ctcp_params) ? ctcp_params : "");
}
else
{
relay_irc_input_send (client, NULL,
"priority_high",
"/query %s %s",
params[0],
(str_args) ? str_args : "");
}
}
if (str_args)
free (str_args);
if (irc_is_channel)
free (irc_is_channel);
if (ctcp_type)
free (ctcp_type);
if (ctcp_params)
free (ctcp_params);
}
}
else if (!relay_irc_command_ignored (irc_command))
+5 -3
View File
@@ -77,6 +77,8 @@
return INT2FIX (__int)
#define API_RETURN_LONG(__long) \
return LONG2NUM (__long)
#define API_RETURN_LONGLONG(__longlong) \
return LL2NUM (__longlong)
/*
@@ -454,9 +456,9 @@ weechat_ruby_api_string_parse_size (VALUE class, VALUE size)
char *c_size;
unsigned long long value;
API_INIT_FUNC(1, "string_parse_size", API_RETURN_LONG(0));
API_INIT_FUNC(1, "string_parse_size", API_RETURN_LONGLONG(0));
if (NIL_P (size))
API_WRONG_ARGS(API_RETURN_LONG(0));
API_WRONG_ARGS(API_RETURN_LONGLONG(0));
Check_Type (size, T_STRING);
@@ -464,7 +466,7 @@ weechat_ruby_api_string_parse_size (VALUE class, VALUE size)
value = weechat_string_parse_size (c_size);
API_RETURN_LONG(value);
API_RETURN_LONGLONG(value);
}
static VALUE
+15 -14
View File
@@ -144,20 +144,6 @@ script_command_script (const void *pointer, void *data,
return WEECHAT_RC_OK;
}
if (weechat_strcmp (argv[1], "go") == 0)
{
if ((argc > 2) && script_buffer && !script_buffer_detail_script)
{
error = NULL;
value = strtol (argv[2], &error, 10);
if (error && !error[0])
{
script_buffer_set_current_line (value);
}
}
return WEECHAT_RC_OK;
}
if (weechat_strcmp (argv[1], "search") == 0)
{
if (scripts_repo)
@@ -216,6 +202,21 @@ script_command_script (const void *pointer, void *data,
return WEECHAT_RC_OK;
}
if (weechat_strcmp (argv[1], "go") == 0)
{
if ((argc > 2) && script_buffer && !script_buffer_detail_script)
{
error = NULL;
value = strtol (argv[2], &error, 10);
if (error && !error[0])
{
script_buffer_set_current_line (value);
script_buffer_check_line_outside_window ();
}
}
return WEECHAT_RC_OK;
}
if (weechat_strcmp (argv[1], "up") == 0)
{
if (script_buffer)
+5 -4
View File
@@ -23,6 +23,7 @@
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
@@ -57,17 +58,17 @@ char *
xfer_network_convert_integer_to_ipv4 (const char *str_address)
{
char *error, result[128];
long number;
long long number;
if (!str_address || !str_address[0])
return NULL;
number = strtol (str_address, &error, 10);
if (!error || error[0] || (number <= 0))
number = strtoll (str_address, &error, 10);
if (!error || error[0] || (number <= 0) || (number > UINT32_MAX))
return NULL;
snprintf (result, sizeof (result),
"%ld.%ld.%ld.%ld",
"%lld.%lld.%lld.%lld",
(number >> 24) & 0xFF,
(number >> 16) & 0xFF,
(number >> 8) & 0xFF,
+17 -17
View File
@@ -83,7 +83,7 @@ def test_strings():
check(weechat.string_parse_size('123 b') == 123)
check(weechat.string_parse_size('120k') == 120000)
check(weechat.string_parse_size('1500m') == 1500000000)
check(weechat.string_parse_size('3g') == 3000000000)
check(weechat.string_parse_size('2g') == 2000000000)
check(weechat.string_color_code_size('') == 0)
check(weechat.string_color_code_size('test') == 0)
str_color = weechat.color('yellow,red')
@@ -397,8 +397,8 @@ def test_display():
weechat.prnt('', '## test print core buffer')
weechat.prnt_date_tags('', 946681200, 'tag1,tag2',
'## test print_date_tags core buffer')
weechat.prnt_date_tags('', 5680744830, 'tag1,tag2',
'## test print_date_tags core buffer, year 2150')
weechat.prnt_date_tags('', 2146383600, 'tag1,tag2',
'## test print_date_tags core buffer, 2038-01-06 09:40:00')
hdata_buffer = weechat.hdata_get('buffer')
hdata_lines = weechat.hdata_get('lines')
hdata_line = weechat.hdata_get('line')
@@ -407,7 +407,7 @@ def test_display():
own_lines = weechat.hdata_pointer(hdata_buffer, buffer, 'own_lines')
line = weechat.hdata_pointer(hdata_lines, own_lines, 'last_line')
data = weechat.hdata_pointer(hdata_line, line, 'data')
check(weechat.hdata_time(hdata_line_data, data, 'date') == 5680744830)
check(weechat.hdata_time(hdata_line_data, data, 'date') == 2146383600)
buffer = weechat.buffer_new('test_formatted',
'buffer_input_cb', '', 'buffer_close_cb', '')
check(buffer != '')
@@ -423,8 +423,8 @@ def test_display():
weechat.prnt_y(buffer, 0, '## test print_y free buffer')
weechat.prnt_y_date_tags(buffer, 0, 946681200, 'tag1,tag2',
'## test print_y_date_tags free buffer')
weechat.prnt_y_date_tags(buffer, 1, 5680744830, 'tag1,tag2',
'## test print_y_date_tags free buffer, year 2150')
weechat.prnt_y_date_tags(buffer, 1, 2146383600, 'tag1,tag2',
'## test print_y_date_tags free buffer, 2038-01-06 09:40:00')
weechat.buffer_close(buffer)
@@ -476,12 +476,12 @@ def test_hooks():
weechat.unhook(hook_cmd)
weechat.unhook(hook_cmplt)
# hook_timer
hook_timer = weechat.hook_timer(5000111000, 0, 1,
hook_timer = weechat.hook_timer(2000111000, 0, 1,
'timer_cb', 'timer_cb_data')
ptr_infolist = weechat.infolist_get('hook', hook_timer, '')
check(ptr_infolist != '')
check(weechat.infolist_next(ptr_infolist) == 1)
check(weechat.infolist_string(ptr_infolist, 'interval') == '5000111000')
check(weechat.infolist_string(ptr_infolist, 'interval') == '2000111000')
weechat.infolist_free(ptr_infolist)
weechat.unhook(hook_timer)
@@ -504,8 +504,8 @@ def infolist_cb(data, infolist_name, pointer, arguments):
check(weechat.infolist_new_var_pointer(item, 'pointer', '0xabcdef') != '')
# Tue Jan 06 2009 08:40:30 GMT+0000
check(weechat.infolist_new_var_time(item, 'time1', 1231231230) != '')
# Tue Jan 06 2150 08:40:30 GMT+0000
check(weechat.infolist_new_var_time(item, 'time2', 5680744830) != '')
# Wed Jan 06 2038 09:40:00 GMT+0000
check(weechat.infolist_new_var_time(item, 'time2', 2146383600) != '')
return infolist
@@ -522,7 +522,7 @@ def test_infolist():
check(weechat.infolist_string(ptr_infolist, 'string') == 'test string')
check(weechat.infolist_pointer(ptr_infolist, 'pointer') == '0xabcdef')
check(weechat.infolist_time(ptr_infolist, 'time1') == 1231231230)
check(weechat.infolist_time(ptr_infolist, 'time2') == 5680744830)
check(weechat.infolist_time(ptr_infolist, 'time2') == 2146383600)
check(weechat.infolist_fields(ptr_infolist) == 'i:integer,s:string,p:pointer,t:time1,t:time2')
check(weechat.infolist_next(ptr_infolist) == 0)
weechat.infolist_free(ptr_infolist)
@@ -549,9 +549,9 @@ def test_hdata():
check(hdata_irc_server != '')
# create a test buffer with 3 messages
buffer2 = weechat.buffer_new('test', 'buffer_input_cb', '', 'buffer_close_cb', '')
weechat.prnt_date_tags(buffer2, 5680744830, 'tag1,tag2', 'prefix1\t## msg1')
weechat.prnt_date_tags(buffer2, 5680744831, 'tag3,tag4', 'prefix2\t## msg2')
weechat.prnt_date_tags(buffer2, 5680744832, 'tag5,tag6', 'prefix3\t## msg3')
weechat.prnt_date_tags(buffer2, 2146383600, 'tag1,tag2', 'prefix1\t## msg1')
weechat.prnt_date_tags(buffer2, 2146383601, 'tag3,tag4', 'prefix2\t## msg2')
weechat.prnt_date_tags(buffer2, 2146383602, 'tag5,tag6', 'prefix3\t## msg3')
own_lines = weechat.hdata_pointer(hdata_buffer, buffer2, 'own_lines')
line1 = weechat.hdata_pointer(hdata_lines, own_lines, 'first_line')
line1_data = weechat.hdata_pointer(hdata_line, line1, 'data')
@@ -619,16 +619,16 @@ def test_hdata():
check(weechat.hdata_compare(hdata_buffer, buffer2, buffer, 'name', 0) < 0)
check(weechat.hdata_compare(hdata_buffer, buffer, buffer, 'name', 0) == 0)
# hdata_update
check(weechat.hdata_time(hdata_line_data, line1_data, 'date') == 5680744830)
check(weechat.hdata_time(hdata_line_data, line1_data, 'date') == 2146383600)
check(weechat.hdata_string(hdata_line_data, line1_data, 'prefix') == 'prefix1')
check(weechat.hdata_string(hdata_line_data, line1_data, 'message') == '## msg1')
update = {
'date': '5680744835',
'date': '2146383605',
'prefix': 'new_prefix1',
'message': 'new_message1'
}
check(weechat.hdata_update(hdata_line_data, line1_data, update) == 3)
check(weechat.hdata_time(hdata_line_data, line1_data, 'date') == 5680744835)
check(weechat.hdata_time(hdata_line_data, line1_data, 'date') == 2146383605)
check(weechat.hdata_string(hdata_line_data, line1_data, 'prefix') == 'new_prefix1')
check(weechat.hdata_string(hdata_line_data, line1_data, 'message') == 'new_message1')
# hdata_get_string
+37 -7
View File
@@ -26,6 +26,8 @@
extern "C"
{
#include <string.h>
#include "src/core/wee-hashtable.h"
#include "src/plugins/weechat-plugin.h"
#include "src/plugins/irc/irc-batch.h"
#include "src/plugins/irc/irc-server.h"
}
@@ -43,14 +45,23 @@ TEST(IrcBatch, Search)
{
struct t_irc_server *server;
struct t_irc_batch *batch1, *batch2;
struct t_hashtable *tags;
server = irc_server_alloc ("server");
CHECK(server);
batch1 = irc_batch_start_batch (server, "ref1", "parent_ref", "type", "params");
tags = hashtable_new (32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
CHECK(tags);
hashtable_set (tags, "time", "2023-08-09T07:43:01.830Z");
hashtable_set (tags, "msgid", "icqfzy7zdbpix4gy8pvzuv49kw");
batch1 = irc_batch_start_batch (server, "ref1", "parent_ref", "type", "params", tags);
CHECK(batch1);
batch2 = irc_batch_start_batch (server, "ref2", "parent_ref", "type", "params");
batch2 = irc_batch_start_batch (server, "ref2", "parent_ref", "type", "params", NULL);
CHECK(batch2);
POINTERS_EQUAL(NULL, irc_batch_search (NULL, NULL));
@@ -105,19 +116,29 @@ TEST(IrcBatch, StartBatch)
{
struct t_irc_server *server;
struct t_irc_batch *batch;
struct t_hashtable *tags;
server = irc_server_alloc ("server");
CHECK(server);
tags = hashtable_new (32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
CHECK(tags);
hashtable_set (tags, "time", "2023-08-09T07:43:01.830Z");
hashtable_set (tags, "msgid", "icqfzy7zdbpix4gy8pvzuv49kw");
POINTERS_EQUAL(NULL, server->batches);
batch = irc_batch_start_batch (server, "ref", NULL, "type", NULL);
batch = irc_batch_start_batch (server, "ref", NULL, "type", NULL, NULL);
CHECK(batch);
POINTERS_EQUAL(batch, server->batches);
STRCMP_EQUAL("ref", batch->reference);
POINTERS_EQUAL(NULL, batch->parent_ref);
STRCMP_EQUAL("type", batch->type);
POINTERS_EQUAL(NULL, batch->parameters);
POINTERS_EQUAL(NULL, batch->tags);
CHECK(batch->start_time > 0);
POINTERS_EQUAL(NULL, batch->messages);
LONGS_EQUAL(0, batch->end_received);
@@ -126,13 +147,19 @@ TEST(IrcBatch, StartBatch)
POINTERS_EQUAL(NULL, server->batches);
batch = irc_batch_start_batch (server, "ref", "parent_ref", "type", "params");
batch = irc_batch_start_batch (server, "ref", "parent_ref", "type", "params",
tags);
CHECK(batch);
POINTERS_EQUAL(batch, server->batches);
STRCMP_EQUAL("ref", batch->reference);
STRCMP_EQUAL("parent_ref", batch->parent_ref);
STRCMP_EQUAL("type", batch->type);
STRCMP_EQUAL("params", batch->parameters);
CHECK(batch->tags);
STRCMP_EQUAL("2023-08-09T07:43:01.830Z",
(const char *)hashtable_get (batch->tags, "time"));
STRCMP_EQUAL("icqfzy7zdbpix4gy8pvzuv49kw",
(const char *)hashtable_get (batch->tags, "msgid"));
CHECK(batch->start_time > 0);
POINTERS_EQUAL(NULL, batch->messages);
@@ -159,7 +186,8 @@ TEST(IrcBatch, AddMessage)
server = irc_server_alloc ("server");
CHECK(server);
batch = irc_batch_start_batch (server, "ref", "parent_ref", "type", "params");
batch = irc_batch_start_batch (server, "ref", "parent_ref", "type", "params",
NULL);
CHECK(batch);
irc_batch_add_message (server, "ref", ":alice PRIVMSG #test: test1");
@@ -187,10 +215,12 @@ TEST(IrcBatch, FreeAll)
server = irc_server_alloc ("server");
CHECK(server);
batch1 = irc_batch_start_batch (server, "ref1", "parent_ref", "type", "params");
batch1 = irc_batch_start_batch (server, "ref1", "parent_ref", "type", "params",
NULL);
CHECK(batch1);
batch2 = irc_batch_start_batch (server, "ref2", "parent_ref", "type", "params");
batch2 = irc_batch_start_batch (server, "ref2", "parent_ref", "type", "params",
NULL);
CHECK(batch2);
POINTERS_EQUAL(batch1, server->batches);
+5 -5
View File
@@ -117,7 +117,7 @@ TEST_GROUP(IrcJoin)
* irc_join_compare_join_channel
*/
TEST(IrcJoin, CompateJoinChannel)
TEST(IrcJoin, CompareJoinChannel)
{
struct t_irc_join_channel join_chan1, join_chan2;
@@ -129,24 +129,24 @@ TEST(IrcJoin, CompateJoinChannel)
LONGS_EQUAL(0, irc_join_compare_join_channel (NULL, &join_chan1, &join_chan2));
join_chan1.name = strdup ("#abc");
LONGS_EQUAL(35, irc_join_compare_join_channel (NULL, &join_chan1, &join_chan2));
CHECK(irc_join_compare_join_channel (NULL, &join_chan1, &join_chan2) > 0);
join_chan2.name = strdup ("#abc");
LONGS_EQUAL(0, irc_join_compare_join_channel (NULL, &join_chan1, &join_chan2));
join_chan1.key = strdup ("key_abc");
LONGS_EQUAL(-1, irc_join_compare_join_channel (NULL, &join_chan1, &join_chan2));
CHECK(irc_join_compare_join_channel (NULL, &join_chan1, &join_chan2) < 0);
join_chan2.key = strdup ("key_abc");
LONGS_EQUAL(0, irc_join_compare_join_channel (NULL, &join_chan1, &join_chan2));
free (join_chan2.key);
join_chan2.key = strdup ("key2_abc");
LONGS_EQUAL(45, irc_join_compare_join_channel (NULL, &join_chan1, &join_chan2));
CHECK(irc_join_compare_join_channel (NULL, &join_chan1, &join_chan2) > 0);
free (join_chan2.name);
join_chan2.name = strdup ("#def");
LONGS_EQUAL(-3, irc_join_compare_join_channel (NULL, &join_chan1, &join_chan2));
CHECK(irc_join_compare_join_channel (NULL, &join_chan1, &join_chan2) < 0);
free (join_chan1.name);
free (join_chan1.key);
+37 -25
View File
@@ -1625,7 +1625,8 @@ TEST(IrcProtocolWithServer, batch_with_batch_cap)
POINTERS_EQUAL(NULL, irc_batch_search (ptr_server, "ref2"));
/* multiline */
RECV(":server BATCH +ref draft/multiline #test");
RECV("@time=2023-08-09T07:43:01.830Z;msgid=icqfzy7zdbpix4gy8pvzuv49kw "
":server BATCH +ref draft/multiline #test");
CHECK_NO_MSG;
RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :line 1");
CHECK_NO_MSG;
@@ -1633,13 +1634,14 @@ TEST(IrcProtocolWithServer, batch_with_batch_cap)
CHECK_NO_MSG;
RECV(":server BATCH -ref");
CHECK_CHAN("bob", "line 1",
"irc_privmsg,irc_tag_batch=ref,irc_batch_type_draft/multiline,"
"notify_message,prefix_nick_248,nick_bob,"
"host_user_b@host_b,log1");
"irc_privmsg,irc_tag_batch=ref,irc_tag_time=2023-08-09T07:43:01.830Z,"
"irc_tag_msgid=icqfzy7zdbpix4gy8pvzuv49kw,"
"irc_batch_type_draft/multiline,notify_message,prefix_nick_248,"
"nick_bob,host_user_b@host_b,log1");
CHECK_CHAN("bob", "line 2",
"irc_privmsg,irc_tag_batch=ref,irc_batch_type_draft/multiline,"
"notify_message,prefix_nick_248,nick_bob,"
"host_user_b@host_b,log1");
"irc_privmsg,irc_tag_batch=ref,irc_tag_time=2023-08-09T07:43:01.830Z,"
"irc_tag_msgid=icqfzy7zdbpix4gy8pvzuv49kw,irc_batch_type_draft/multiline,"
"notify_message,prefix_nick_248,nick_bob,host_user_b@host_b,log1");
/* multiline with CTCP */
RECV(":server BATCH +ref draft/multiline #test");
@@ -1666,7 +1668,8 @@ TEST(IrcProtocolWithServer, batch_with_batch_cap)
irc_server_buffer_set_input_multiline (ptr_server, 1);
/* multiline */
RECV(":server BATCH +ref draft/multiline #test");
RECV("@time=2023-08-09T07:43:01.830Z;msgid=icqfzy7zdbpix4gy8pvzuv49kw "
":server BATCH +ref draft/multiline #test");
CHECK_NO_MSG;
RECV("@batch=ref :bob!user_b@host_b PRIVMSG #test :line 1");
CHECK_NO_MSG;
@@ -1675,9 +1678,10 @@ TEST(IrcProtocolWithServer, batch_with_batch_cap)
RECV(":server BATCH -ref");
CHECK_CHAN("bob", "line 1\n"
"line 2",
"irc_privmsg,irc_tag_batch=ref,irc_batch_type_draft/multiline,"
"notify_message,prefix_nick_248,nick_bob,host_user_b@host_b,"
"log1");
"irc_privmsg,irc_tag_batch=ref,irc_tag_time=2023-08-09T07:43:01.830Z,"
"irc_tag_msgid=icqfzy7zdbpix4gy8pvzuv49kw,"
"irc_batch_type_draft/multiline,notify_message,prefix_nick_248,"
"nick_bob,host_user_b@host_b,log1");
/* multiline with CTCP */
RECV(":server BATCH +ref draft/multiline #test");
@@ -2423,7 +2427,7 @@ TEST(IrcProtocolWithServer, notice)
/*
* notice to channel/user from self nick
* (case of bouncer of if echo-message capability is enabled)
* (case of bouncer or if echo-message capability is enabled)
*/
RECV(":alice!user@host NOTICE #test :a notice ");
CHECK_CHAN("--", "Notice(alice) -> #test: a notice ",
@@ -2440,7 +2444,7 @@ TEST(IrcProtocolWithServer, notice)
/*
* notice to ops of channel from self nick
* (case of bouncer of if echo-message capability is enabled)
* (case of bouncer or if echo-message capability is enabled)
*/
RECV(":alice!user@host NOTICE @#test :a notice ");
CHECK_CHAN("--", "Notice(alice) -> @#test: a notice ",
@@ -2449,7 +2453,7 @@ TEST(IrcProtocolWithServer, notice)
/*
* notice from self nick
* (case of bouncer of if echo-message capability is enabled)
* (case of bouncer or if echo-message capability is enabled)
*/
RECV(":alice!user@host NOTICE alice :a notice ");
CHECK_SRV("--", "Notice -> alice: a notice ",
@@ -2481,6 +2485,14 @@ TEST(IrcProtocolWithServer, notice)
CHECK_CHAN("--", "PvNotice(bob): a notice ",
"irc_notice,nick_bob,host_user@host,log1");
/*
* notice to another nick with channel name at beginning
* (case of a notice sent if echo-message capability is enabled)
*/
RECV(":alice!user@host NOTICE bob :[#test] a notice ");
CHECK_SRV("--", "Notice -> bob: [#test] a notice ",
"irc_notice,notify_private,nick_alice,host_user@host,log1");
/* broken CTCP to channel */
RECV(":bob!user@host NOTICE #test :\01");
CHECK_SRV("--", "CTCP reply from bob: ",
@@ -2743,7 +2755,7 @@ TEST(IrcProtocolWithServer, privmsg)
/*
* message to channel/user from self nick
* (case of bouncer of if echo-message capability is enabled)
* (case of bouncer or if echo-message capability is enabled)
*/
RECV(":alice!user@host PRIVMSG #test :this is the message ");
CHECK_CHAN("alice", "this is the message ",
@@ -2757,7 +2769,7 @@ TEST(IrcProtocolWithServer, privmsg)
/*
* message to ops of channel from self nick
* (case of bouncer of if echo-message capability is enabled)
* (case of bouncer or if echo-message capability is enabled)
*/
RECV(":alice!user@host PRIVMSG @#test :this is the message ");
CHECK_CHAN("--", "Msg(alice) -> @#test: this is the message ",
@@ -2766,7 +2778,7 @@ TEST(IrcProtocolWithServer, privmsg)
/*
* message from self nick in private
* (case of bouncer of if echo-message capability is enabled)
* (case of bouncer or if echo-message capability is enabled)
*/
RECV(":alice!user@host PRIVMSG alice :this is the message ");
CHECK_PV("alice", "alice", "this is the message ",
@@ -2775,7 +2787,7 @@ TEST(IrcProtocolWithServer, privmsg)
/*
* message from self nick in private, with password hidden (nickserv)
* (case of bouncer of if echo-message capability is enabled)
* (case of bouncer or if echo-message capability is enabled)
*/
RECV(":alice!user@host PRIVMSG nickserv :identify secret");
CHECK_PV("nickserv", "alice", "identify ******",
@@ -2865,8 +2877,8 @@ TEST(IrcProtocolWithServer, privmsg)
CHECK_CHAN(" *", "bob",
"irc_privmsg,irc_action,notify_message,nick_bob,"
"host_user@host,log1");
RECV(":bob!user@host PRIVMSG #test :\01ACTION is testing\01");
CHECK_CHAN(" *", "bob is testing",
RECV(":bob!user@host PRIVMSG #test :\01ACTION is testing with \02bold\02\01");
CHECK_CHAN(" *", "bob is testing with bold",
"irc_privmsg,irc_action,notify_message,nick_bob,"
"host_user@host,log1");
RECV(":bob!user@host PRIVMSG #test :\01VERSION\01");
@@ -2884,7 +2896,7 @@ TEST(IrcProtocolWithServer, privmsg)
/*
* valid CTCP to channel from self nick
* (case of bouncer of if echo-message capability is enabled)
* (case of bouncer or if echo-message capability is enabled)
*/
RECV(":alice!user@host PRIVMSG #test :\01VERSION\01");
CHECK_CHAN("--", "CTCP query to #test: VERSION",
@@ -2894,14 +2906,14 @@ TEST(IrcProtocolWithServer, privmsg)
CHECK_CHAN(" *", "alice",
"irc_privmsg,irc_action,self_msg,notify_none,no_highlight,"
"nick_alice,host_user@host,log1");
RECV(":alice!user@host PRIVMSG #test :\01ACTION is testing\01");
CHECK_CHAN(" *", "alice is testing",
RECV(":alice!user@host PRIVMSG #test :\01ACTION is testing with \02bold\02\01");
CHECK_CHAN(" *", "alice is testing with bold",
"irc_privmsg,irc_action,self_msg,notify_none,no_highlight,"
"nick_alice,host_user@host,log1");
/*
* valid CTCP to ops of channel from self nick
* (case of bouncer of if echo-message capability is enabled)
* (case of bouncer or if echo-message capability is enabled)
*/
RECV(":alice!user@host PRIVMSG @#test :\01ACTION\01");
CHECK_CHAN("--", "Action -> @#test: alice",
@@ -2948,7 +2960,7 @@ TEST(IrcProtocolWithServer, privmsg)
/*
* valid CTCP to channel from self nick
* (case of bouncer of if echo-message capability is enabled)
* (case of bouncer or if echo-message capability is enabled)
*/
RECV(":alice!user@host PRIVMSG alice :\01CLIENTINFO\01");
if (i == 0)
+91
View File
@@ -21,6 +21,8 @@
#include "CppUTest/TestHarness.h"
#include "tests/tests.h"
extern "C"
{
#include <stdio.h>
@@ -28,6 +30,8 @@ extern "C"
#include "src/core/wee-hook.h"
#include "src/plugins/irc/irc-tag.h"
#include "src/plugins/plugin.h"
extern char *irc_tag_hashtable_to_string (struct t_hashtable *tags);
}
#define WEE_CHECK_ESCAPE_VALUE(__result, __string) \
@@ -161,3 +165,90 @@ TEST(IrcTag, Parse)
hashtable_free (hashtable);
}
/*
* Tests functions:
* irc_tag_add_to_string_cb
* irc_tag_hashtable_to_string
*/
TEST(IrcTag, HashtableToString)
{
char *str;
struct t_hashtable *tags;
POINTERS_EQUAL(NULL, irc_tag_hashtable_to_string (NULL));
tags = hashtable_new (32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
CHECK(tags);
WEE_TEST_STR("", irc_tag_hashtable_to_string (tags));
hashtable_set (tags, "time", "2023-08-09T07:43:01.830Z");
hashtable_set (tags, "msgid", "icqfzy7zdbpix4gy8pvzuv49kw");
hashtable_set (tags, "test", "value with spaces");
WEE_TEST_STR("time=2023-08-09T07:43:01.830Z;"
"msgid=icqfzy7zdbpix4gy8pvzuv49kw;"
"test=value\\swith\\sspaces",
irc_tag_hashtable_to_string (tags));
hashtable_free (tags);
}
/*
* Tests functions:
* irc_tag_add_to_hashtable_cb
* irc_tag_add_tags_to_message
*/
TEST(IrcTag, AddTagsToMessage)
{
char *str;
struct t_hashtable *tags;
POINTERS_EQUAL(NULL, irc_tag_add_tags_to_message (NULL, NULL));
WEE_TEST_STR("", irc_tag_add_tags_to_message ("", NULL));
WEE_TEST_STR(":nick!user@host PRIVMSG #test :hello",
irc_tag_add_tags_to_message (
":nick!user@host PRIVMSG #test :hello", NULL));
WEE_TEST_STR("@tag1;tag2=value2 :nick!user@host PRIVMSG #test :hello",
irc_tag_add_tags_to_message (
"@tag1;tag2=value2 :nick!user@host PRIVMSG #test :hello",
NULL));
tags = hashtable_new (32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
CHECK(tags);
WEE_TEST_STR(":nick!user@host PRIVMSG #test :hello",
irc_tag_add_tags_to_message (
":nick!user@host PRIVMSG #test :hello", tags));
WEE_TEST_STR("@tag1;tag2=value2 :nick!user@host PRIVMSG #test :hello",
irc_tag_add_tags_to_message (
"@tag1;tag2=value2 :nick!user@host PRIVMSG #test :hello",
tags));
hashtable_set (tags, "time", "2023-08-09T07:43:01.830Z");
hashtable_set (tags, "msgid", "icqfzy7zdbpix4gy8pvzuv49kw");
hashtable_set (tags, "test", "value with spaces");
WEE_TEST_STR("@time=2023-08-09T07:43:01.830Z;msgid=icqfzy7zdbpix4gy8pvzuv49kw;"
"test=value\\swith\\sspaces :nick!user@host PRIVMSG #test :hello",
irc_tag_add_tags_to_message (
":nick!user@host PRIVMSG #test :hello", tags));
WEE_TEST_STR("@tag1;tag2=value2;time=2023-08-09T07:43:01.830Z;"
"msgid=icqfzy7zdbpix4gy8pvzuv49kw;test=value\\swith\\sspaces "
":nick!user@host PRIVMSG #test :hello",
irc_tag_add_tags_to_message (
"@tag1;tag2=value2 :nick!user@host PRIVMSG #test :hello",
tags));
hashtable_free (tags);
}
@@ -199,7 +199,10 @@ TEST(LoggerBacklog, GroupMessages)
"end of line",
"2023-06-04 21:15:34\t\tFirst line",
"of multiline message",
"",
"end of message",
"2023-06-04 21:15:37\t\tTwo lines with empty line",
"",
"2023-06-04 21:15:40\t\tMessage on one line",
NULL,
};
@@ -207,7 +210,7 @@ TEST(LoggerBacklog, GroupMessages)
POINTERS_EQUAL(NULL, logger_backlog_group_messages (NULL));
lines = arraylist_new (3, 0, 1,
lines = arraylist_new (32, 0, 1,
&test_logger_backlog_msg_cmp_cb, NULL,
&test_logger_backlog_msg_free_cb, NULL);
@@ -234,15 +237,18 @@ TEST(LoggerBacklog, GroupMessages)
messages = logger_backlog_group_messages (lines);
CHECK(messages);
LONGS_EQUAL(3, arraylist_size (messages));
LONGS_EQUAL(4, arraylist_size (messages));
STRCMP_EQUAL("end of line",
(const char *)arraylist_get (messages, 0));
STRCMP_EQUAL("2023-06-04 21:15:34\t\tFirst line\n"
"of multiline message\n"
"\n"
"end of message",
(const char *)arraylist_get (messages, 1));
STRCMP_EQUAL("2023-06-04 21:15:40\t\tMessage on one line",
STRCMP_EQUAL("2023-06-04 21:15:37\t\tTwo lines with empty line\n",
(const char *)arraylist_get (messages, 2));
STRCMP_EQUAL("2023-06-04 21:15:40\t\tMessage on one line",
(const char *)arraylist_get (messages, 3));
arraylist_free (messages);
+229 -11
View File
@@ -79,21 +79,24 @@ TEST(LoggerTail, LoggerTailLastEol)
TEST(LoggerTail, LoggerTailFile)
{
char *filename;
FILE *file;
const char *content = "line 1\nline 2\nline 3";
const char *content_3_lines = "line 1\nline 2\nline 3\n";
const char *content_5_lines = "line 1\nline 2\n\nline 3\n\n";
char *filename, line[4096];
struct t_arraylist *lines;
/* write a test file */
filename = string_eval_path_home ("${weechat_data_dir}/test_file.txt",
NULL, NULL, NULL);
file = fopen (filename, "w");
fwrite (content, 1, strlen (content), file);
fflush (file);
fclose (file);
FILE *file;
int i;
POINTERS_EQUAL(NULL, logger_tail_file (NULL, 0));
POINTERS_EQUAL(NULL, logger_tail_file (NULL, 1));
/* write a small test file */
filename = string_eval_path_home ("${weechat_data_dir}/test_file.txt",
NULL, NULL, NULL);
file = fopen (filename, "w");
fwrite (content_3_lines, 1, strlen (content_3_lines), file);
fflush (file);
fclose (file);
POINTERS_EQUAL(NULL, logger_tail_file (filename, 0));
lines = logger_tail_file (filename, 1);
@@ -127,4 +130,219 @@ TEST(LoggerTail, LoggerTailFile)
unlink (filename);
free (filename);
/* write a small test file, with empty lines */
filename = string_eval_path_home ("${weechat_data_dir}/test_file.txt",
NULL, NULL, NULL);
file = fopen (filename, "w");
fwrite (content_5_lines, 1, strlen (content_5_lines), file);
fflush (file);
fclose (file);
POINTERS_EQUAL(NULL, logger_tail_file (filename, 0));
lines = logger_tail_file (filename, 1);
CHECK(lines);
LONGS_EQUAL(1, arraylist_size (lines));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 0));
arraylist_free (lines);
lines = logger_tail_file (filename, 2);
CHECK(lines);
LONGS_EQUAL(2, arraylist_size (lines));
STRCMP_EQUAL("line 3", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1));
arraylist_free (lines);
lines = logger_tail_file (filename, 3);
CHECK(lines);
LONGS_EQUAL(3, arraylist_size (lines));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("line 3", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 2));
arraylist_free (lines);
lines = logger_tail_file (filename, 4);
CHECK(lines);
LONGS_EQUAL(4, arraylist_size (lines));
STRCMP_EQUAL("line 2", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("line 3", (const char *)arraylist_get (lines, 2));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 3));
arraylist_free (lines);
lines = logger_tail_file (filename, 5);
CHECK(lines);
LONGS_EQUAL(5, arraylist_size (lines));
STRCMP_EQUAL("line 1", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("line 2", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 2));
STRCMP_EQUAL("line 3", (const char *)arraylist_get (lines, 3));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 4));
arraylist_free (lines);
lines = logger_tail_file (filename, 6);
CHECK(lines);
LONGS_EQUAL(5, arraylist_size (lines));
STRCMP_EQUAL("line 1", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("line 2", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 2));
STRCMP_EQUAL("line 3", (const char *)arraylist_get (lines, 3));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 4));
arraylist_free (lines);
unlink (filename);
free (filename);
/* write a bigger test file */
filename = string_eval_path_home ("${weechat_data_dir}/test_file.txt",
NULL, NULL, NULL);
file = fopen (filename, "w");
for (i = 0; i < 1000; i++)
{
snprintf (line, sizeof (line), "this is a test, line %d\n", i + 1);
fwrite (line, 1, strlen (line), file);
}
fflush (file);
fclose (file);
POINTERS_EQUAL(NULL, logger_tail_file (filename, 0));
lines = logger_tail_file (filename, 1);
CHECK(lines);
LONGS_EQUAL(1, arraylist_size (lines));
STRCMP_EQUAL("this is a test, line 1000", (const char *)arraylist_get (lines, 0));
arraylist_free (lines);
lines = logger_tail_file (filename, 2);
CHECK(lines);
LONGS_EQUAL(2, arraylist_size (lines));
STRCMP_EQUAL("this is a test, line 999", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("this is a test, line 1000", (const char *)arraylist_get (lines, 1));
arraylist_free (lines);
lines = logger_tail_file (filename, 3);
CHECK(lines);
LONGS_EQUAL(3, arraylist_size (lines));
STRCMP_EQUAL("this is a test, line 998", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("this is a test, line 999", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("this is a test, line 1000", (const char *)arraylist_get (lines, 2));
arraylist_free (lines);
lines = logger_tail_file (filename, 4);
CHECK(lines);
LONGS_EQUAL(4, arraylist_size (lines));
STRCMP_EQUAL("this is a test, line 997", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("this is a test, line 998", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("this is a test, line 999", (const char *)arraylist_get (lines, 2));
STRCMP_EQUAL("this is a test, line 1000", (const char *)arraylist_get (lines, 3));
arraylist_free (lines);
lines = logger_tail_file (filename, 1000);
CHECK(lines);
LONGS_EQUAL(1000, arraylist_size (lines));
STRCMP_EQUAL("this is a test, line 1", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("this is a test, line 2", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("this is a test, line 3", (const char *)arraylist_get (lines, 2));
STRCMP_EQUAL("this is a test, line 4", (const char *)arraylist_get (lines, 3));
STRCMP_EQUAL("this is a test, line 998", (const char *)arraylist_get (lines, 997));
STRCMP_EQUAL("this is a test, line 999", (const char *)arraylist_get (lines, 998));
STRCMP_EQUAL("this is a test, line 1000", (const char *)arraylist_get (lines, 999));
arraylist_free (lines);
lines = logger_tail_file (filename, 2000);
CHECK(lines);
LONGS_EQUAL(1000, arraylist_size (lines));
STRCMP_EQUAL("this is a test, line 1", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("this is a test, line 2", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("this is a test, line 3", (const char *)arraylist_get (lines, 2));
STRCMP_EQUAL("this is a test, line 4", (const char *)arraylist_get (lines, 3));
STRCMP_EQUAL("this is a test, line 998", (const char *)arraylist_get (lines, 997));
STRCMP_EQUAL("this is a test, line 999", (const char *)arraylist_get (lines, 998));
STRCMP_EQUAL("this is a test, line 1000", (const char *)arraylist_get (lines, 999));
arraylist_free (lines);
unlink (filename);
free (filename);
/* write a bigger test file, with empty lines */
filename = string_eval_path_home ("${weechat_data_dir}/test_file.txt",
NULL, NULL, NULL);
file = fopen (filename, "w");
for (i = 0; i < 1000; i++)
{
snprintf (line, sizeof (line), "this is a test, line %d\n\n", i + 1);
fwrite (line, 1, strlen (line), file);
}
fflush (file);
fclose (file);
POINTERS_EQUAL(NULL, logger_tail_file (filename, 0));
lines = logger_tail_file (filename, 1);
CHECK(lines);
LONGS_EQUAL(1, arraylist_size (lines));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 0));
arraylist_free (lines);
lines = logger_tail_file (filename, 2);
CHECK(lines);
LONGS_EQUAL(2, arraylist_size (lines));
STRCMP_EQUAL("this is a test, line 1000", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1));
arraylist_free (lines);
lines = logger_tail_file (filename, 3);
CHECK(lines);
LONGS_EQUAL(3, arraylist_size (lines));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("this is a test, line 1000", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 2));
arraylist_free (lines);
lines = logger_tail_file (filename, 4);
CHECK(lines);
LONGS_EQUAL(4, arraylist_size (lines));
STRCMP_EQUAL("this is a test, line 999", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("this is a test, line 1000", (const char *)arraylist_get (lines, 2));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 3));
arraylist_free (lines);
lines = logger_tail_file (filename, 2000);
CHECK(lines);
LONGS_EQUAL(2000, arraylist_size (lines));
STRCMP_EQUAL("this is a test, line 1", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("this is a test, line 2", (const char *)arraylist_get (lines, 2));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 3));
STRCMP_EQUAL("this is a test, line 3", (const char *)arraylist_get (lines, 4));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 5));
STRCMP_EQUAL("this is a test, line 998", (const char *)arraylist_get (lines, 1994));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1995));
STRCMP_EQUAL("this is a test, line 999", (const char *)arraylist_get (lines, 1996));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1997));
STRCMP_EQUAL("this is a test, line 1000", (const char *)arraylist_get (lines, 1998));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1999));
arraylist_free (lines);
lines = logger_tail_file (filename, 4000);
CHECK(lines);
LONGS_EQUAL(2000, arraylist_size (lines));
STRCMP_EQUAL("this is a test, line 1", (const char *)arraylist_get (lines, 0));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1));
STRCMP_EQUAL("this is a test, line 2", (const char *)arraylist_get (lines, 2));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 3));
STRCMP_EQUAL("this is a test, line 3", (const char *)arraylist_get (lines, 4));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 5));
STRCMP_EQUAL("this is a test, line 998", (const char *)arraylist_get (lines, 1994));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1995));
STRCMP_EQUAL("this is a test, line 999", (const char *)arraylist_get (lines, 1996));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1997));
STRCMP_EQUAL("this is a test, line 1000", (const char *)arraylist_get (lines, 1998));
STRCMP_EQUAL("", (const char *)arraylist_get (lines, 1999));
arraylist_free (lines);
unlink (filename);
free (filename);
}
@@ -49,6 +49,8 @@ extern void relay_irc_sendf (struct t_relay_client *client,
const char *format, ...);
extern void relay_irc_parse_cap_message (struct t_relay_client *client,
struct t_hashtable *parsed_msg);
extern void relay_irc_parse_ctcp (const char *message,
char **ctcp_type, char **ctcp_params);
extern int relay_irc_tag_relay_client_id (const char *tags);
extern void relay_irc_input_send (struct t_relay_client *client,
const char *irc_channel,
@@ -812,6 +814,72 @@ TEST(RelayIrcWithClient, RelayIrcRecvCommandCapab)
LONGS_EQUAL(1, RELAY_IRC_DATA(ptr_relay_client, cap_end_received));
}
/*
* Tests functions:
* relay_irc_parse_ctcp
*/
TEST(RelayIrcWithClient, RelayIrcParseCtcp)
{
char *ctcp_type, *ctcp_params;
relay_irc_parse_ctcp (NULL, NULL, NULL);
relay_irc_parse_ctcp ("test", NULL, NULL);
ctcp_type = (char *)0x01;
ctcp_params = (char *)0x01;
relay_irc_parse_ctcp (NULL, &ctcp_type, &ctcp_params);
POINTERS_EQUAL(NULL, ctcp_type);
POINTERS_EQUAL(NULL, ctcp_params);
ctcp_type = (char *)0x01;
ctcp_params = (char *)0x01;
relay_irc_parse_ctcp ("\01ACTION is testing\01", &ctcp_type, &ctcp_params);
STRCMP_EQUAL("ACTION", ctcp_type);
STRCMP_EQUAL("is testing", ctcp_params);
free (ctcp_type);
free (ctcp_params);
ctcp_type = (char *)0x01;
ctcp_params = (char *)0x01;
relay_irc_parse_ctcp ("\01ACTION is testing \01 extra", &ctcp_type, &ctcp_params);
STRCMP_EQUAL("ACTION", ctcp_type);
STRCMP_EQUAL(" is testing ", ctcp_params);
free (ctcp_type);
free (ctcp_params);
ctcp_type = (char *)0x01;
ctcp_params = (char *)0x01;
relay_irc_parse_ctcp ("\01VERSION\01", &ctcp_type, &ctcp_params);
STRCMP_EQUAL("VERSION", ctcp_type);
POINTERS_EQUAL(NULL, ctcp_params);
free (ctcp_type);
ctcp_type = (char *)0x01;
ctcp_params = (char *)0x01;
relay_irc_parse_ctcp ("\01ACTION is testing", &ctcp_type, &ctcp_params);
POINTERS_EQUAL(NULL, ctcp_type);
POINTERS_EQUAL(NULL, ctcp_params);
ctcp_type = (char *)0x01;
ctcp_params = (char *)0x01;
relay_irc_parse_ctcp ("\01VERSION", &ctcp_type, &ctcp_params);
POINTERS_EQUAL(NULL, ctcp_type);
POINTERS_EQUAL(NULL, ctcp_params);
ctcp_type = (char *)0x01;
ctcp_params = (char *)0x01;
relay_irc_parse_ctcp ("test", &ctcp_type, &ctcp_params);
POINTERS_EQUAL(NULL, ctcp_type);
POINTERS_EQUAL(NULL, ctcp_params);
ctcp_type = (char *)0x01;
ctcp_params = (char *)0x01;
relay_irc_parse_ctcp ("", &ctcp_type, &ctcp_params);
POINTERS_EQUAL(NULL, ctcp_type);
POINTERS_EQUAL(NULL, ctcp_params);
}
/*
* Tests functions:
* relay_irc_recv
@@ -49,6 +49,9 @@ TEST(XferNetwork, ConvertIntegerToIpv4)
POINTERS_EQUAL(NULL, xfer_network_convert_integer_to_ipv4 ("0"));
POINTERS_EQUAL(NULL, xfer_network_convert_integer_to_ipv4 ("-1"));
/* too big: UINT32_MAX + 1 = 4294967296 */
POINTERS_EQUAL(NULL, xfer_network_convert_integer_to_ipv4 ("4294967296"));
WEE_TEST_STR("0.0.0.1", xfer_network_convert_integer_to_ipv4 ("1"));
WEE_TEST_STR("0.0.1.0", xfer_network_convert_integer_to_ipv4 ("256"));
WEE_TEST_STR("0.1.0.0", xfer_network_convert_integer_to_ipv4 ("65536"));
+2 -2
View File
@@ -39,8 +39,8 @@
# devel-number the devel version as hex number ("0x04010000" for "4.1.0-dev")
#
WEECHAT_STABLE="4.0.2"
WEECHAT_DEVEL="4.0.2"
WEECHAT_STABLE="4.0.4"
WEECHAT_DEVEL="4.0.4"
STABLE_MAJOR=$(echo "${WEECHAT_STABLE}" | cut -d"." -f1)
STABLE_MINOR=$(echo "${WEECHAT_STABLE}" | cut -d"." -f2)