1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-06 01:33:12 +02:00

Fixed IRC message parser bug

This commit is contained in:
Sebastien Helleu
2005-09-15 14:02:38 +00:00
parent c953db4d64
commit 9c7d05f605
4 changed files with 96 additions and 56 deletions
+1
View File
@@ -5,6 +5,7 @@ ChangeLog - 2005-09-15
Version 0.1.5 (under dev!):
* fixed IRC message parser bug
* fixed scroll problem (screen moving when scrolling and new line
displayed)
* fixed infinite loop when scrolling back and displaying long lines
+47 -28
View File
@@ -523,6 +523,42 @@ server_msgq_add_msg (t_irc_server *server, char *msg)
}
}
/*
* server_msgq_add_unterminated: add an unterminated message to queue
*/
void
server_msgq_add_unterminated (t_irc_server *server, char *string)
{
if (server->unterminated_message)
{
server->unterminated_message =
(char *) realloc (server->unterminated_message,
strlen (server->unterminated_message) +
strlen (string) + 1);
if (!server->unterminated_message)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s not enough memory for received IRC message\n"),
WEECHAT_ERROR);
}
else
strcat (server->unterminated_message, string);
}
else
{
server->unterminated_message = strdup (string);
if (!server->unterminated_message)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s not enough memory for received IRC message\n"),
WEECHAT_ERROR);
}
}
}
/*
* server_msgq_add_buffer: explode received buffer, creating queued messages
*/
@@ -543,44 +579,27 @@ server_msgq_add_buffer (t_irc_server *server, char *buffer)
}
else
{
pos = strstr (buffer, "\n");
if (pos)
pos = strstr (buffer, "\r");
if (pos && !pos[1])
{
pos[0] = '\0';
server_msgq_add_msg (server, buffer);
buffer = pos + 1;
server_msgq_add_unterminated (server, buffer);
return;
}
else
{
if (server->unterminated_message)
pos = strstr (buffer, "\n");
if (pos)
{
server->unterminated_message =
(char *) realloc (server->unterminated_message,
strlen (server->unterminated_message) +
strlen (buffer) + 1);
if (!server->unterminated_message)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s not enough memory for received IRC message\n"),
WEECHAT_ERROR);
}
else
strcat (server->unterminated_message, buffer);
pos[0] = '\0';
server_msgq_add_msg (server, buffer);
buffer = pos + 1;
}
else
{
server->unterminated_message = strdup (buffer);
if (!server->unterminated_message)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s not enough memory for received IRC message\n"),
WEECHAT_ERROR);
}
server_msgq_add_unterminated (server, buffer);
return;
}
return;
}
}
}
+1
View File
@@ -5,6 +5,7 @@ ChangeLog - 2005-09-15
Version 0.1.5 (under dev!):
* fixed IRC message parser bug
* fixed scroll problem (screen moving when scrolling and new line
displayed)
* fixed infinite loop when scrolling back and displaying long lines
+47 -28
View File
@@ -523,6 +523,42 @@ server_msgq_add_msg (t_irc_server *server, char *msg)
}
}
/*
* server_msgq_add_unterminated: add an unterminated message to queue
*/
void
server_msgq_add_unterminated (t_irc_server *server, char *string)
{
if (server->unterminated_message)
{
server->unterminated_message =
(char *) realloc (server->unterminated_message,
strlen (server->unterminated_message) +
strlen (string) + 1);
if (!server->unterminated_message)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s not enough memory for received IRC message\n"),
WEECHAT_ERROR);
}
else
strcat (server->unterminated_message, string);
}
else
{
server->unterminated_message = strdup (string);
if (!server->unterminated_message)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s not enough memory for received IRC message\n"),
WEECHAT_ERROR);
}
}
}
/*
* server_msgq_add_buffer: explode received buffer, creating queued messages
*/
@@ -543,44 +579,27 @@ server_msgq_add_buffer (t_irc_server *server, char *buffer)
}
else
{
pos = strstr (buffer, "\n");
if (pos)
pos = strstr (buffer, "\r");
if (pos && !pos[1])
{
pos[0] = '\0';
server_msgq_add_msg (server, buffer);
buffer = pos + 1;
server_msgq_add_unterminated (server, buffer);
return;
}
else
{
if (server->unterminated_message)
pos = strstr (buffer, "\n");
if (pos)
{
server->unterminated_message =
(char *) realloc (server->unterminated_message,
strlen (server->unterminated_message) +
strlen (buffer) + 1);
if (!server->unterminated_message)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s not enough memory for received IRC message\n"),
WEECHAT_ERROR);
}
else
strcat (server->unterminated_message, buffer);
pos[0] = '\0';
server_msgq_add_msg (server, buffer);
buffer = pos + 1;
}
else
{
server->unterminated_message = strdup (buffer);
if (!server->unterminated_message)
{
irc_display_prefix (server->buffer, PREFIX_ERROR);
gui_printf (server->buffer,
_("%s not enough memory for received IRC message\n"),
WEECHAT_ERROR);
}
server_msgq_add_unterminated (server, buffer);
return;
}
return;
}
}
}