diff --git a/ChangeLog b/ChangeLog index 7cd643bc0..89c95a8a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/src/irc/irc-server.c b/src/irc/irc-server.c index 62d1c91ac..bbb085566 100644 --- a/src/irc/irc-server.c +++ b/src/irc/irc-server.c @@ -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; } } } diff --git a/weechat/ChangeLog b/weechat/ChangeLog index 7cd643bc0..89c95a8a3 100644 --- a/weechat/ChangeLog +++ b/weechat/ChangeLog @@ -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 diff --git a/weechat/src/irc/irc-server.c b/weechat/src/irc/irc-server.c index 62d1c91ac..bbb085566 100644 --- a/weechat/src/irc/irc-server.c +++ b/weechat/src/irc/irc-server.c @@ -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; } } }